30

当我用编译器警告(JDK 1.5)编译我的项目时,我收到一堆错误的路径元素警告:

警告:: [path] 错误的路径元素“C:\Users\User\MyJava\common\lib\junit.jar”:没有这样的文件或目录警告:: [path] 错误的路径元素“C:\Users\User\ MyJava\common\lib\jdom.jar": 没有这样的文件或目录警告:: [path] bad path element "C:\Users\User\MyJava\common\lib\xerces.jar": 没有这样的文件或目录警告:: [path] bad path element "C:\Users\User\MyJava\common\lib\xml-apis.jar": 没有这样的文件或目录

还有很多。

这是使用 IDEA 8.1.3。我在 IDEA 的配置中找不到任何指向这些文件的地方(我对整个项目进行了 grepped)。他们确实都不再以那个名字存在了,但是是什么引用了他们呢?

4

4 回答 4

36

我认为@Yishai 有这个权利(我会给他一个支持让球滚动的投票)。我一直遇到这个。在我认为对 Java 语言来说是一个可怕的决定中,他们认为允许类路径设置进入 jar 文件中的 MANIFEST 文件是可以的。所以本质上,Jars 可以在其中包含指向其他类和位于其他地方的 jar 的文件,当它们指向的其他东西不存在时,您会看到与您收到的警告类似的警告。这些警告来自编译类路径中的 Jar 文件。因此,如果您真的在乎,您需要做的是追踪有问题的 jar 文件,提取 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 文件,因此我通常最终使用 shell 循环来帮助我查看它们。您可以将所有有问题的罐子复制到一个临时目录并运行这样的循环(bash 语法):

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

这将打印当前目录中每个 Jar 文件的名称,提取其内容,并 grep 其清单文件以获取类路径条目。如果输出中的 jar 文件的名称后面有“Class-Path”打印输出,这意味着 Jar 在其清单中具有类路径设置。通过这种方式,您有望找出需要对哪些罐子采取行动。

于 2009-08-28T04:58:18.140 回答
28

据此,问题在于在第三方 jars 中清单中有对这些的引用。可以通过将 -Xlint:-path 添加到编译参数来禁用该消息。

于 2009-08-28T02:34:09.007 回答
0

您是否检查过设置 CLASSPATH 环境变量和编译选项的位置?

于 2009-08-27T23:46:39.250 回答
0

有问题的路径元素很可能在 JAR 的清单文件中。要找到有问题的 JAR,您可以运行这个 shell 脚本,它将仅提取清单文件并显示它具有的任何类路径:

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
于 2015-11-21T23:35:57.900 回答