从JAR读取META-INF / MANIFEST.MF

时间:2018-02-13 10:38:24

标签: java

这很奇怪。我尝试从应用程序本身读取META-INF / MANIFEST.MF:

URL url = getClass().getResource("/META-INF/MANIFEST.MF");

但是MANIFEST.MF是另一个:

jar:file:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar!/META-INF/MANIFEST.MF

这在过去有效,但现在它将它定位在另一个JAR中!很奇怪。

已更新

按照 haraldK 的建议尝试了此操作,但返回的枚举为空,因此不打印任何内容:

try {
    Enumeration<URL> manifests = getClass().getClassLoader().getResources("/META-INF/MANIFEST.MF");

    while(manifests.hasMoreElements()) {
        URL url = manifests.nextElement();
        System.out.println("Es: > " + url);
    }
} catch (Exception e) {
    System.err.println(e.getMessage());
}

2 个答案:

答案 0 :(得分:2)

根据类加载器和类路径上JAR的顺序,这只是正常行为。由于有/META-INF/MANIFEST.MF的多个实例,您实际获得的实例依赖于类加载器(加载当前类,由代码中的getClass()返回)。

相反,您可以使用ClassLoader.getResouces(String),它会为您提供所有清单的枚举:

Enumeration<URL> manifests = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");

从该枚举中,您可以找到合适的。

另一种选择是使用Package类,这样您就可以轻松访问类/包清单中的信息:

Package myPackage = getClass().getPackage();
myPackage.getImplementationTitle();
myPackage.getImplementationVersion();
myPackage.getImplementationVendor();

答案 1 :(得分:1)

GetClass()。getResource行为取决于类加载器的实现:https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html 也许你的应用程序有额外的类加载器?

类似的问题在这里:Reading my own Jar's Manifest