我正在尝试获取我的应用程序类路径。
我有一个jar(名为 application.jar),它的Manifest.mf中有其他 jar 文件,例如Class-Path: a.jar b.jar
.
为什么当我使用System.getProperty("java.class.path")
我的 jar时, a.jar和b.jar没有列出?
我正在尝试获取我的应用程序类路径。
我有一个jar(名为 application.jar),它的Manifest.mf中有其他 jar 文件,例如Class-Path: a.jar b.jar
.
为什么当我使用System.getProperty("java.class.path")
我的 jar时, a.jar和b.jar没有列出?
它可能与从类路径环境变量(或)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 文件是所有用户类的来源,其他用户类路径设置将被忽略。
这正是我提出的问题。即使使用时java -cp ..;myTest.jar test2.Needer
我只得到“..;myTest.jar”作为java.class.path
属性的结果。
注意:即使使用-cp
参数,也会搜索给定的类路径MANIFEST.MF
!(在谷歌上找不到这个信息并测试了自己)
-jar
所以我认为这与参数无关。在链接中你可以找到
通配符的扩展是在调用程序的主要方法之前尽早完成的,而不是在类加载过程本身的后期完成。
有趣的是,我在测试中发现:递归搜索 MANFIFEST.MF 中的类路径。因此,如果test.jar
myTest.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 使用的内容)。而且由于这种无意义的搜索会延迟程序启动(因为递归搜索可能非常深),因此没有实现。