这很奇怪。我尝试从应用程序本身读取 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());
}
最佳答案
根据类加载器和类路径上 JAR 的顺序,这只是正常行为。由于/META-INF/MANIFEST.MF
有多个实例,您实际获得的类加载器取决于类加载器(加载当前类,由代码中的 getClass()
返回)。
相反,您可以使用 ClassLoader.getResouces(String)
,这将为您提供所有 list 的枚举:
Enumeration<URL> manifests = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
从该枚举中,您可以找到正确的一个。
另一个选项是使用 Package
类,这将使您可以轻松访问类/包 list 中的信息:
Package myPackage = getClass().getPackage();
myPackage.getImplementationTitle();
myPackage.getImplementationVersion();
myPackage.getImplementationVendor();
关于java - 从 JAR 中读取 META-INF/MANIFEST.MF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764757/