java.class.path没有带来Manifest.mf Class-Path属性

时间:2012-12-17 16:55:49

标签: java classpath manifest.mf

我正在尝试获取应用程序类路径。

我有一个 jar (名为application.jar),它的 Manifest.mf 其他jar文件,例如Class-Path: a.jar b.jar

为什么当我使用System.getProperty("java.class.path")时,我的广告 a.jar b.jar 未列出?

2 个答案:

答案 0 :(得分:3)

这可能与java.class.path是从类路径环境变量($CLASSPATH-classpath)设置的系统属性有关。使用-jar选项会忽略这些选项。

根据java -jar文档,当使用该jar选项运行应用程序时,只考虑清单Class-Path并忽略其他设置。 来自http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html

  

-jar

     

执行封装在JAR文件中的程序。第一个参数是JAR文件的名称而不是启动类名称。为了使此选项起作用,JAR文件的清单必须包含Main-Class:classname形式的一行。这里,classname标识具有public static void main(String [] args)方法的类,该方法充当应用程序的起点。有关使用Jar文件和Jar文件清单的信息,请参阅Jar工具参考页面和Java Tutorial的Jar跟踪。

     

使用此选项时,JAR文件是所有用户类的源,其他用户类路径设置将被忽略。

答案 1 :(得分:0)

这也是我出现的问题。即使在使用java -cp ..;myTest.jar test2.Needer时,我只能获得" ..; myTest.jar"因为java.class.path财产。

注意:即使使用-cp参数,也会搜索MANIFEST.MF中的给定类路径! (无法在谷歌上找到这些信息并自行测试)

所以我认为这与-jar参数无关。在Link中,您可以找到

  

在类加载过程中,在调用程序的主要方法之前,而不是迟到,才能尽早扩展通配符。

有趣的是,我在测试期间发现: MANFIFEST.MF中的类路径被递归搜索。因此,如果myTest的MANIFEST.MF中的类路径中存在给定的test.jar文件。 jar,test.jar的MANIFEST.MF中的类路径也会被查找(使用java -cp "myTest.jar" test2.Needer时)。

因此,当java.class.path属性支持显示MANIFEST.MF的类路径时,它还应显示所有后续依赖.jar文件的类路径。由于只有在找到类之前才会搜索类路径,所以这不会很好地引用延迟加载机制。

TL; DR :我认为这与-jar参数无关(-cp也是如此)。在我的解释中,显示来自MANIFEST.MF的类路径的支持只会带来额外的,无意义的递归搜索成本(因为不需要成为实际的依赖,分别是从.jar中使用的依赖)。而且由于这种无意义的搜索会延迟程序的启动(因为递归搜索可能非常深),所以它没有实现。