在OS X上读取Jar的清单

时间:2014-09-13 22:37:07

标签: java macos

我在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");

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

1 个答案:

答案 0 :(得分:2)

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

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

如果您特别想要包含Example.class的jar,可以使用

找到它
Example.class.getProtectionDomain().getCodeSource().getLocation()