在 OS X 上读取 Jar 的清单

Posted

技术标签:

【中文标题】在 OS X 上读取 Jar 的清单【英文标题】:Reading a Jar's Manifest on OS X 【发布时间】:2014-11-07 19:40:53 【问题描述】:

我在 jar 文件中有以下清单:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.3
Created-By: 1.7.0_67-b01 (Oracle Corporation)
Main-Class: tld.project.Example

Name: tld/project
Specification-Title: Example
Specification-Version: 1.0
Specification-Vendor: Me
Implementation-Title: tld.project
Implementation-Version: 20140913
Implementation-Vendor: Me

我在运行时使用以下内容从清单中读取一些属性:

// Try and load the Jar manifest as a resource stream.
InputStream manInputStream = Example.class.getResourceAsStream("/META-INF/MANIFEST.MF");
if (manInputStream != null) 
    // Try and extract a version string from the Manifest.
    Manifest manifest = new Manifest(manInputStream);

    Attributes attributes = manifest.getAttributes("tld/project");

为什么上面的代码将属性设置为空,但只在 OS X 上? (1.7.51) 如果我检查 manifest.getEntries().size() 它也返回零,但同样,这在 Windows 和 Linux 上按预期工作。有什么想法吗?

【问题讨论】:

我认为最可能的解释是,由于某种原因,清单不是您认为的 Mac 上的内容。我想不出任何其他方式。 【参考方案1】:

Example.class.getResourceAsStream 不一定会在包含Example.class 的同一个 jar 文件中查找,它会搜索类加载器上所有可用的 JAR,并为您提供它找到的第一个匹配资源。这不是特定于 Mac OS 的,它在所有平台上都是相同的规则,但是当你在 mac 上运行时,与在 windows 或 Linux 上相比,你的类路径的顺序可能不同,并且你从不同的 jar 中获取清单。

您可以使用getResource 查看您实际加载的清单。

如果你特别想要包含 Example.class 的 jar,你可以找到它

Example.class.getProtectionDomain().getCodeSource().getLocation()

【讨论】:

优秀的捕获和解决方案。谢谢!

以上是关于在 OS X 上读取 Jar 的清单的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 从 JAR 中读取 MANIFEST.MF 文件

JAR清单代码库不匹配

java.lang.IllegalStateException:无法从jar文件spring-plugin-core-1.2.0.RELEASE.jar的清单中读取Class-Path属性

Jacob.jar 运行报错,提示没有主属性清单是为啥?

使用 Intellij 2016 创建 Jar - 没有主要清单属性

jar中没有主清单属性