【发布时间】:2021-12-01 19:43:44
【问题描述】:
我有一个 Java 应用程序(使用 NetBeans 12.5 和 OpenJDK 11 编译),其中清单文件是正确的,但看起来我正在从错误的文件中检索属性(?)。 浏览我在 META-INF/MANIFEST.MF 中正确拥有的构建的 jar 我期望的属性,如
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.8
Created-By: 11.0.11+9-Ubuntu-0ubuntu2.20.04 (Ubuntu)
Bundle-Name: AppName
Bundle-Version: 1.1.3-b000
Bundle-Date: 2021-10-13 10:47:03 CEST
Implementation-Title: AppName
Implementation-Version: 1.1.3-b000
Implementation-URL: http://www.example.com
...
虽然当我的代码读入时
String swVersion = getClass().getPackage().getImplementationVersion();
结果是null
现在,有了更复杂的
try {
InputStream is = getClass()
.getResourceAsStream("/META-INF/MANIFEST.MF");
if (is != null) {
Properties p = new Properties();
p.load(is);
swRelease = p.getProperty("Implementation-Version");
}
} catch ( IOException e )
{
}
我从调试中看到的是p.load(is); 之后p 中列出的属性只有三个
[0] = (ConcurrentHashMap$MapEntry) "Manifest-Version => 1.0"
[1] = (ConcurrentHashMap$MapEntry) "Created-By => 11.0.5 (Ubuntu)"
[2] = (ConcurrentHashMap$MapEntry) "Main-Class => org.GNOME.Accessibility.AtkWrapper"
所以这显然 不是我的 MANIFEST.MF ...
我有点困惑:有什么提示吗?
[编辑]
想要的结果是,在某种程度上,我只想能够做类似System.out.println(swVersion); 的事情,并从版本代码中获得1.1.3-b000 的输出,就像我的清单中一样
【问题讨论】:
-
类路径上的多个 JAR 文件可以有一个具有该名称的文件。只需使用
getResourceAsStream,您就可以有效地随机选择一个。 -
@JoachimSauer 这解释了第二个测试,我显然错了。第一次尝试呢?
-
不清楚。你如何启动你的应用程序?如果您从 IDE 中启动它,那么很可能不会构建/涉及 JAR 文件,而是直接从编译目标目录加载类。
-
我从 IDE 和直接以
java -jar myapp.jar启动——应用程序按预期运行 -
无关:你为什么要使用一个空的 catch 块?忽略异常确实是不好的做法,至少打印出来,这样你就有机会弄清楚发生了什么。
标签: java manifest.mf