java - 从 JAR 中读取 META-INF/MANIFEST.MF

标签 java

这很奇怪。我尝试从应用程序本身读取 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/

相关文章:

java - 在内存中创建了多少个字符串?

java - 有什么工具可以帮助用户设计要由我的应用程序使用的状态机?

Java - 关于捕获异常的建议?

java - Spring Java 微服务 war 规模过大

java - 使用for循环在数组中查找最大值和最小值?

java - 为什么我们使用Interface来定义方法并在Concrete Class中实现和定义它的主体?

java - 在 Swing 应用程序中仅使用 JavaFX 触摸事件

java - 将 NetBeans maven 操作导入 Eclipse

井字游戏中的 Java Alpha-Beta 修剪

java - 无法使用 Http put 方法将数据发送到 URL