Получить имя исполняемого банку из метода main()
Я создал исполняемый банку и использовал commons-cli, чтобы дать пользователю возможность указывать параметры командной строки при запуске клиента. Все работает нормально. Однако, когда я печатаю инструкцию использования для jar, я хотел бы показать следующее:
usage: java -jar myprog.jar <options> <file>
--help Display the help message
--debug Enable debugging
....
Печать всех опций легко выполняется с помощью commons-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;
}
}
Ответы
Ответ 1
Здесь вы идете:
new java.io.File(SomeClassInYourJar.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName()
Изменить: Я видел ваш комментарий о API getSourceCode. Ну, это, наверное, лучшее, что вы можете сделать на Java. О getCodeSource()
return null
, я думаю, что это происходит главным образом в классах в java.lang.*
и других специальных классах, для которых местоположение источника "скрыто". Однако, если вы работаете над своими собственными классами.
Ответ 2
Вы должны в любом случае добавить .toURI() перед вызовом getPath(). Это из-за некоторых причуд в реализации java-URL - см. как закодировать URL-адрес, чтобы избежать специальных символов в java для деталей.