Предупреждение о плохом пути, откуда оно? - PullRequest
23 голосов
/ 28 августа 2009

Когда я компилирую свой проект с предупреждениями компилятора (JDK 1.5), я получаю кучу предупреждений о неверных элементах пути:

Предупреждение :: [путь] элемент неверного пути "C: \ Users \ User \ MyJava \ common \ lib \ junit.jar": такого файла или каталога нет Предупреждение :: [путь] неверный элемент пути "C: \ Users \ User \ MyJava \ common \ lib \ jdom.jar": такого файла или каталога нет Предупреждение :: [путь] неверный элемент пути "C: \ Users \ User \ MyJava \ common \ lib \ xerces.jar": такого файла или каталога нет Предупреждение :: [путь] неверный элемент пути "C: \ Users \ User \ MyJava \ common \ lib \ xml-apis.jar": такого файла или каталога нет

и многие другие.

Это использует IDEA 8.1.3. Я не могу найти нигде в конфигурации IDEA (я выделил весь проект), где что-либо указывает на эти файлы. Они все действительно больше не существуют под этим именем, но что на них ссылается?

Ответы [ 4 ]

28 голосов
/ 28 августа 2009

Я думаю, что @ Yishai имеет на это право (я дам ему право голоса за то, что он перевернулся). Я сталкиваюсь с этим все время. В то, что я считаю ужасным решением для языка Java, они решили, что было бы хорошо разрешить настройкам classpath идти в файлы MANIFEST внутри jar-файлов. В сущности, у Jars могут быть файлы внутри, которые указывают на другие классы и jar-файлы, расположенные в другом месте, и когда другие вещи, на которые они указывают, не существуют, вы видите предупреждения, подобные тем, которые вы получаете. Эти предупреждения приходят из файлов Jar, которые находятся на вашем пути к классам компиляции. Итак, что вам нужно сделать, если вы действительно заботитесь, так это отследить проблемные файлы JAR, извлечь содержимое файлов JAR, удалить настройки «Class-Path» в их файлах манифеста и воссоздать их. Примерно так (переместите jar во временный каталог куда-нибудь первым):

#Extract the jar file
jar xvf myfile.jar
rm myfile.jar
emacs ./META-INF/MANIFEST.MF

*Find the entry "Class-path:" and remove it completely and save the changes

#Rebuild the jar file
jar cvf myfile.jar ./*

Это должно сработать!

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

Скорее всего, вам придется просматривать тонну jar-файлов, поэтому я обычно использую цикл оболочки, чтобы помочь мне просмотреть их. Вы можете скопировать все ваши JAR-файлы во временный каталог и запустить цикл, подобный следующему (синтаксис bash):

for i in *.jar; do echo $i; jar xf $i; grep -i 'class-path' ./META-INF/MANIFEST.MF; done

Это будет печатать имя каждого файла Jar в текущем каталоге, извлекать его содержимое и grep его файла манифеста для записей classpath. Если имя файла jar в выходных данных имеет распечатку «Class-Path» после него, это означает, что Jar имеет настройки пути к классам в своем манифесте. Таким образом, вы можете надеяться выяснить, над какими банками вам нужно действовать.

25 голосов
/ 28 августа 2009

Согласно this , проблема в том, что в банках сторонних производителей есть ссылка на них в манифесте. Сообщение можно отключить, добавив -Xlint: -path к параметрам компиляции.

0 голосов
/ 22 ноября 2015

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

for i in *.jar; do echo $i; /path/to/your/jdk/bin/jar xf $i META-INF/MANIFEST.MF; grep -i 'class-path' META-INF/MANIFEST.MF; done
0 голосов
/ 28 августа 2009

Вы проверили места, в которых установлены переменная окружения CLASSPATH и опция компиляции?

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