Как найти путь к запущенному файлу JAR - PullRequest
0 голосов
/ 16 апреля 2011

Я пытаюсь программно найти полный путь к файлу JAR во время его работы. Я знаю, что есть ряд других вопросов по этому поводу, но ни один из них, похоже, не работает для меня - в первую очередь, я наткнулся на

MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().g­etPath()

несколько раз. Этот конкретный метод работает для меня при отладке в Eclipse, но после компиляции в jar он возвращает исключение NullPointerException. Другие методы столкнулись с подобными проблемами после компиляции.

У меня есть временный обходной путь с использованием java.class.path, но он возвращает полный путь, только когда я выполняю jar из графического интерфейса пользователя - в терминале это не удается.

Я также должен отметить, что единственная система, на которой у меня эта проблема, - это Linux. На Windows и Mac у меня нет проблем.

Любая помощь будет оценена :)

Спасибо!

Derek

РЕДАКТИРОВАТЬ: JAR исполняемый, если это что-то меняет.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

У меня работает следующее даже при запуске из файла jar:

URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation();
String p = URLDecoder.decode(url.getFile(), "UTF-8");
File jarFile = new File(p);

Отправка пути через URLDecoder важна, потому что в противном случае будет создан путь с %20, если каталог содержитпространства.

2 голосов
/ 16 апреля 2011

Вы не можете сделать это.Для ClassLoaders не требуется поддержка этого, а большинство - нет.

Или, возможно, эта формулировка была бы более полезной.Бинарные классы входят в JVM через ClassLoader объекты.ClassLoader объекты не обязаны отслеживать происхождение классов, которые они загружают.И они могут загружать их откуда угодно: банку, через Интернет, базу данных, старую консервную банку.

Итак, если вы хотите всегда знать происхождение классов в вашем приложении, вы должны всегда загружатькод с загрузчиком классов, который действительно отслеживает происхождение удобным для вас способом.

Если вы контролируете все приложение, вы можете сделать это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...