【问题标题】:java.class.path doesn't bring Manifest.mf Class-Path propertyjava.class.path 不带 Manifest.mf Class-Path 属性
【发布时间】:2012-12-04 19:15:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: java classpath manifest.mf


    【解决方案1】:

    这可能与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 文件是所有用户类的来源,其他用户类路径设置将被忽略。

    【讨论】:

    • 你忘了说最重要的一点:即使没有列出 JAR,但其中的类仍然可以访问
    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 2021-03-02
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2012-05-13
      • 2019-05-03
      • 2016-10-25
      • 2015-01-29
      相关资源
      最近更新 更多