Подтвердить что ты не робот

Получить имя исполняемого банку из метода 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;
    }
}
4b9b3361

Ответ 1

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

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

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