Java Jar и Classpath проблемы - PullRequest
       4

Java Jar и Classpath проблемы

1 голос
/ 13 октября 2011

У меня есть странная проблема, которую я не могу понять ... У меня есть простой jar HelloWorld, который я построил в Eclipse, в котором есть Apache Loggings jar на пути к классам.Я написал скрипт для запуска jar:

#!/bin/sh
export CLASSPATH=lib/*:$CLASSPATH
java -jar HelloWorld.jar 

Структура каталогов здесь представляет собой главный каталог с подкаталогом HelloWorld.jar и lib, в котором содержится commons-logging-1.1.1.jar.

* 1009.* Запуск этого скрипта работает нормально.Однако, когда я помещаю HelloWorld.jar в каталог lib (т. Е. Чтобы он содержал все JAR-файлы в одном месте) и выполняю java -jar lib/HelloWorld.jar, я получаю:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

error.Почему?!?!?!?!

Я спрашиваю об этом, потому что я использовал JarBundler на OSX для создания пакета приложения для приложения HelloWorld и поместил модифицированный скрипт в каталог MacOS, тогда каквсе библиотеки находятся в каталоге Resources/Java.Модифицированная версия скрипта:

#!/bin/sh
RESOURCE_DIR=$(cd "../Resources"; pwd)
export CLASSPATH=$RESOURCE_DIR/Java/*:$CLASSPATH
java -jar $RESOURCE_DIR/Java/HelloWorld.jar 

, и я получаю ту же ошибку, что и выше, я был бы очень признателен за помощь в понимании, почему я не могу это сделать и / или как это исправить?

Ответы [ 6 ]

6 голосов
/ 13 октября 2011

Classpath не работает с подстановочными знаками. Каждый jar-файл должен быть указан явно, либо как часть переменной CLASSPATH, либо как манифест другого jar-файла, включенного в classpath.

Кроме того, IIRC java -jar игнорирует все сторонние jar-файлы, присутствующие в пути к классам. Почему бы не сделать это вместо этого?

java -cp yourJar:logJars <mainClass>
2 голосов
/ 13 октября 2011

Java не будет работать с lib / *, но оболочка может расширять его для вас.Дважды проверьте это.Поместите строку после экспорта:

echo $CLASSPATH

Кроме того, я бы порекомендовал поместить ее в файл MANIFEST, как уже упоминалось.

РЕДАКТИРОВАТЬ: это проблема с разрешениями?Если вы запускаете приложение от имени пользователя root / admin или помещаете файл в другое место и используете полный путь, это работает?

2 голосов
/ 13 октября 2011

Попробуйте добавить файл commons-logging-1.1.1.jar непосредственно в CLASSPATH

1 голос
/ 14 октября 2011

Спасибо всем за помощь в выяснении этого.По сути, файл манифеста создавался и упаковывался в банку без моего ведома, поэтому любые флаги $CLASSPATH или -cp игнорировались.В моем проекте Eclipse мой classpath был установлен на $(projectRoot)/lib, что совпадало с той же структурой каталогов, что и мой каталог dist.Однако, когда они были объединены в один каталог с помощью OSX JarBundler, этот каталог больше не присутствовал, следовательно, ошибки пути к классам!

Я попытался удалить атрибут Class-Path из MANIFEST.MF, который создал Eclispe, но командастроки $CLASSPATH и / или -cp, кажется, все еще не имеют значения ... Отрицает ли существование файла манифеста все записи пути к классам командной строки?

1 голос
/ 13 октября 2011

Используйте файл MANIFEST (папка META-INF) для работы с записями Classpath. Используйте относительные пути для библиотек.

Для получения дополнительной информации, посмотрите здесь .

В основном, для случая регистрации общего достояния внутри папки lib:

Class-Path: lib/commons-logging-1.1.1.jar

И для обоих банок в одной папке:

Class-Path: commons-logging-1.1.1.jar
0 голосов
/ 13 октября 2011

вы установили log4j.jar в свой класс.я думаю, что вы не добавили log4j.jar в его путь к классам.

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