【问题标题】:Runtime version information from manifest in JavaJava 清单中的运行时版本信息
【发布时间】: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


【解决方案1】:

你所做的与我为 Read the jar version for a class 所做的一致。

因此,我坚信只有在 Netbeans 中运行时才会出现问题,正如 Joachim 所解释的那样,应用程序是直接从已编译的类中运行的,不涉及 JAR 文件。我感觉完全一样的效果。

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多