从jar中读取元I-Inf/subtest.mf



这很奇怪。我尝试从应用程序本身读取Meta-Inf/subest.mf:

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

但是ustest.mf是另一个:

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

这在过去起作用,但是现在它将其定位在另一个罐子中!非常非常奇怪。

更新

按照 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());
}

取决于类加载器和类路径上的罐子的顺序,这只是正常行为。由于有多个实例的/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();

getClass((。getResource行为取决于classLoader的实现:https://docs.oracle.com/javase/8/docs/docs/technotes/guides/guides/guides/lang/rang/resources.html也许您的应用程序有其他classloader?

类似的问题在这里:阅读我自己的罐子的清单