【问题标题】:How to identify jar version when it runs运行时如何识别jar版本
【发布时间】:2019-07-20 20:55:21
【问题描述】:

有没有办法在编译过程中向 jar 中添加一些信息。并在执行期间查看该信息以了解正在执行的 jar。

我的场景是我正在构建一个具有固定 jar 名称的 jar 并将其发送到另一台机器上运行。然而,有时它似乎运行旧版本的 jar。有什么方法可以识别它而无需更改 jar 文件名并在编译期间提供信息。我不能每次都更改 Java 代码,但如果需要,可以进行一次更改。

【问题讨论】:

  • 您可以将版本放在MANIFEST.MF中,并在启动jar时打印。
  • 或者您可以添加一个类,通过该类您可以从 pom 中检索信息(如版本)
  • jar默认将java版本添加到manifest
  • 我正在使用 gradle jar 命令构建 jar。我无法多次更改文件。
  • 我可以使用 Java 打印清单版本吗?我想使用日志来验证它,而不需要提取 jar 并查看 Manifest 文件。

标签: java jar versioning


【解决方案1】:

要从 jar 中获取版本,请使用:

OneOfYourClasses.class.getPackage().getImplementationVersion();

这假设您已经在 MANIFEST.MF 中设置了实现版本,您可以在构建时执行此操作。它可以包括一个日期。

使用 Maven,maven-shade-plugin 可以使用 ManifestResourceTransformer 转换器为您执行此操作(我这里只是使用 pom 中的版本):

<manifestEntries>
      <Implementation-Title>${project.artifactId}</Implementation-Title>
      <Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>

应该有类似的gradle插件。

编辑:Gradle 做得更简单(来自https://docs.gradle.org/current/userguide/java_plugin.html):

jar {
    manifest {
        attributes("Implementation-Title": "YourJarName",
                   "Implementation-Version": version)
    }
}

编辑:如果你在 Linux 上,你可以从命令行查看版本:

unzip -p yourfile.jar META-INF/MANIFEST.MF | grep Implementation-Version

【讨论】:

  • 如何动态放置版本而不需要手动更改?
  • 上面的代码将使用您在 pom 或 gradle 文件中的版本。要使其更具动态性,请添加日期。有关示例,请参阅stackoverflow.com/questions/19172565/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2011-01-17
  • 2018-05-27
  • 2021-08-20
  • 2020-03-27
  • 2011-02-18
  • 2018-03-19
相关资源
最近更新 更多