如何将有关属性的文件版本详细信息添加到 .jar?

问题描述 投票:0回答:3

我希望添加一个产品版本号以显示在我的 .jar 文件信息中。目前我在我的 Spring boot 项目中使用 Maven 进行 API Rest。

我已经阅读了很多关于清单版本控制的解决方案。您必须在那里解压缩并访问 META-INF/MANIFEST.MF 以检查实现版本。这对我要找的东西来说太乏味了。

就像一个.exe。您可以在鼠标右键单击 -> 详细信息 -> “产品版本”下找到它,或者只需检查文件版本列,如图所示。 Example of a file version description.

我还读到 JAR 文件是一种基于流行的 ZIP 文件格式的文件格式,用于将许多文件聚合成一个文件。我有点想将文件版本添加到 .zip,但我还是想问问这是否可能。

问候,加斯帕。

java spring-boot maven jar
3个回答
1
投票

JAR 文件本身不能有版本。但是你正在使用 Maven,这意味着你已经可以访问 Maven 版本:

try (InputStream inputStream = getClass().getResourceAsStream("/META-INF/maven/<groupId>/<artifactId>/pom.properties")) {
    Properties properties = new Properties();
    properties.load(inputStream);
    // available properties:
    // - artifactId=xxx
    // - groupId=xxx
    // - version=xxx
}

请注意,这在单元测试中通常不起作用(尤其是从 IDE 运行时),因为文件仅添加到 JAR 文件中。


0
投票

只需在 jar 中的任何位置包含一个文本文件。构建各种类型的系统使这变得微不足道。然后在你的代码中写下你用版本读出这个文本文件,并在屏幕上显示它。

在 maven、gradle 等中,要在 jar 中包含纯文本文件,只需将其放入

src/main/resources/version.txt
即可自动包含。

要用 java 阅读它:

public class Main {
  public static String getVersion() {
    try (var in = Main.class.getResourceAsStream("/version.txt")) {
      return new String(in.readAllBytes(), StandardCharsets.UTF_8);
    }
  }
}

这个:

  • 要求类加载器使用加载
    .class
    文件的相同系统加载 version.txt。
  • 完全读取该输入流,并使用 UTF_8 编码将其转换为字符串。
  • 使用 try-with-resources 因为,它是一种资源,如果你不想泄漏,你必须这样做。

0
投票

如果您不一定需要确切的版本,我见过的一种助记策略是触摸文件时间戳。它可能不合适和/或您必须确定如何处理超出时间戳范围的数字。

eg 使用 Powershell 设置 LastWriteTime(或 CreationTime)以匹配 v2.3.4 -> 02:03:04

$ff = Get-Item my.jar
$ff.LastWriteTime         # Monday, 24 April 2023 16:25:56
$ff.LastWriteTime = $(Get-Date "24-apr-2023 02:03:04")
$ff.LastWriteTime         # Monday, 24 April 2023 02:03:04

LastWriteTime 将显示在 Windows 资源管理器的“修改日期”列中。

© www.soinside.com 2019 - 2024. All rights reserved.