这很奇怪。我尝试从应用程序本身读取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());
}
答案 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