2012-06-22 3 views
21

Я создал исполняемую банку и использовал commons-cli, чтобы дать пользователю возможность указывать параметры командной строки при запуске клиента. Все работает нормально. Однако, когда я печатаю заявление об использовании для кувшина, я хотел бы показать следующее:Получить имя исполняемого банку из метода main()

usage: java -jar myprog.jar <options> <file> 
--help Display the help message 
--debug Enable debugging 
.... 

Печати всех вариантов легко сделать с Викискладом Cli. Тем не менее, строка «использование» является головным скребком. Я не могу понять, как получить имя «myprog.jar» из args [], которое передается приложению.

Есть ли простой способ сделать это? Я мог бы использовать довольно сложный метод для отслеживания следа от класса classloader и выяснить, содержится ли он в банке, но это кажется довольно уродливым ответом на то, что должно быть довольно простым вопросом.

private String getPath(Class cls) { 
    String cn = cls.getName(); 
    String rn = cn.replace('.', '/') + ".class"; 
    String path = 
      getClass().getClassLoader().getResource(rn).getPath(); 
    int ix = path.indexOf("!"); 
    if(ix >= 0) { 
     return path.substring(0, ix); 
    } else { 
     return path; 
    } 
} 
+0

пытался http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file?lq=1? – Charles

+0

Я уже видел эту ссылку, но это выглядело так, как будто это был «взлом». Я не могу поверить, что нет более прямого решения. Кроме того, API заявляет, что «getCodeSource()» может возвращать значение NULL, но не уточняет, в каких условиях, поэтому я, естественно, задавался вопросом, использовать ли это «отказоустойчивый» метод. –

ответ

33

Здесь вы идете:

new java.io.File(SomeClassInYourJar.class.getProtectionDomain() 
    .getCodeSource() 
    .getLocation() 
    .getPath()) 
.getName() 

Edit: Я видел ваш комментарий о getSourceCode API. Ну, это, наверное, лучшее, что вы можете сделать на Java. Около getCodeSource() возвращение null, я думаю, что это происходит главным образом на классах в java.lang.* и других специальных классах, для которых местоположение источника «скрыто». Тем не менее, нужно работать на собственные классы.

+0

Спасибо - это то же самое, что указал @Charles в SO-ссылке. Моя самая большая проблема, о которой я говорил выше, заключается в том, что api для 'getCodeSource()' указывает, что она может быть нулевой, но не уточняет, при каких условиях. –

+0

Другая проблема заключается в том, что он не учитывает тот факт, что файл класса может быть вложен в архивы. Поэтому мне все равно нужно проверить подстроку '!'. Как я уже сказал, это кажется немного неуклюжим, и я очень удивлен, что у Java нет лучшего решения. –

+0

Это в основном потому, что редко существует причина узнать имя файла jar, из которого вы работаете. Функциональность должна (в идеале) быть независимой от имени. – Charles

Смежные вопросы