首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阅读META-INF/MANIFEST.MF从JAR

阅读META-INF/MANIFEST.MF从JAR
EN

Stack Overflow用户
提问于 2018-02-13 10:38:23
回答 2查看 2.9K关注 0票数 0

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

代码语言:javascript
复制
URL url = getClass().getResource("/META-INF/MANIFEST.MF");

但MANIFEST.MF是另一个:

代码语言:javascript
复制
jar:file:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar!/META-INF/MANIFEST.MF

这在过去是可行的,但现在它将它定位在另一个罐子中!非常非常奇怪。

更新

按照haraldK的建议进行了尝试,但返回的枚举为空,因此没有打印:

代码语言:javascript
复制
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());
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-13 10:55:40

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

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

代码语言:javascript
复制
Enumeration<URL> manifests = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");

从该枚举中,您可以查找正确的枚举。

另一个选项是使用Package类,它使您可以轻松地访问类/包的清单中的信息:

代码语言:javascript
复制
Package myPackage = getClass().getPackage();
myPackage.getImplementationTitle();
myPackage.getImplementationVersion();
myPackage.getImplementationVendor();
票数 2
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48764757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档