6

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

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

为什么当我使用System.getProperty("java.class.path")我的 jar时, a.jarb.jar没有列出?

4

2 回答 2

5

它可能与从类路径环境变量(或)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 文件的清单必须包含格式为 Main-Class: classname 的行。在这里,classname 标识具有用作应用程序起点的 public static void main(String[] args) 方法的类。有关使用 Jar 文件和 Jar 文件清单的信息,请参阅 Jar 工具参考页面和 Java 教程的 Jar 跟踪。

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

于 2012-12-17T18:22:32.387 回答
0

这正是我提出的问题。即使使用时java -cp ..;myTest.jar test2.Needer我只得到“..;myTest.jar”作为java.class.path属性的结果。

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

-jar所以我认为这与参数无关。在链接中你可以找到

通配符的扩展是在调用程序的主要方法之前尽早完成的,而不是在类加载过程本身的后期完成。

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

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

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

于 2015-08-20T12:27:59.623 回答