Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > ClassLoader,import,java -jar


Автор: esi 8.6.2009, 16:57
Есть небольшое приложение с использованием сторонних библиотек (например log4j.jar), упакованное в main.jar. Использованные в main.jar библиотеки (например log4j.jar) находятся рядом, используются через import org.apache.log4j.Logger;.  

Необходимо предоставить простой механизм запуска java -jar, без возникновения NoClassDefFoundError. Любая попытка передачи параметра -cp либо добавление в Manifest атрибута Class-Path игнорируются.

Вопрос: можно ли это осуществить, или необходимо отказаться от import в пользу динамической загрузки Class.forName? Как лучше всего реализовать идею?

Автор: tux 8.6.2009, 17:37
Что значит игнорируется? Значит неправильно указаны подгружаемые библиотеки. Если планируется запускать приложение используя Main-Class в манифесте, тогда и библиотеки нужно указывать в манифесте. Если класс задается в командной строке, то и библиотеки должны быть перечислены в -cp в командной строке. Сейчас как это делается?

Автор: esi 8.6.2009, 17:56
Запуск через java -jar -cp: java -cp log4j.jar -jar main.jar
программа запускается, почти сразу после этого падает с ошибкой java.lang.NoClassDefFoundError: org/apache/log4j/Logger, насколько я помню, при запуске java -jar параметр -cp игнорируется. 

При указании Class-Path все работает, действительно неправильно указал имя файла. 

Автор: tux 8.6.2009, 18:44
Цитата(esi @  8.6.2009,  17:56 Найти цитируемый пост)
насколько я помню, при запуске java -jar параметр -cp игнорируется. 

Совершенно верно. если запускать таким образом, то classpath берется из манифеста. Если запустить так, то все должно работать:
Цитата

java -cp log4j.jar:main.jar some.package.MyClass


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)