这很奇怪。我尝试从应用程序本身读取META/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这在过去是可行的,但现在它将它定位在另一个罐子中!非常非常奇怪。
更新
按照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());
}发布于 2018-02-13 10:55:40
根据类加载器和类路径上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();发布于 2018-02-13 10:58:07
GetClass().getResource行为取决于类加载器的实现:https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html也许您的应用程序有额外的类加载器?
类似的问题出现在这里:Reading my own Jar's Manifest
https://stackoverflow.com/questions/48764757
复制相似问题