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

sg3maiej  于 2023-05-21  发布在  Java
关注(0)|答案(3)|浏览(176)

我希望添加一个产品版本号出现在我的.jar文件信息。目前,我在Sping Boot 项目中使用Maven进行API Rest。
我读过很多关于manifest版本控制的解决方案。在那里,您必须解压缩并访问META-INF/MANIFEST.MF来检查Implementation-Version。对我想找的东西来说太乏味了。
就像一个. exe。在这里你可以找到它在鼠标右键点击->详细信息->“产品版本”或简单地检查文件版本列所示的图像。Example of a file version description
另外,我读到JAR文件是一种基于流行的ZIP文件格式的文件格式,用于将许多文件聚合为一个。有点,我想添加一个文件版本到.zip,但我想问无论如何,如果这是可能的。
你好加斯帕

iyr7buue

iyr7buue1#

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文件中。

7qhs6swi

7qhs6swi2#

只需在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,因为它是一个资源,如果不想泄漏,就必须这样做。
sy5wg1nm

sy5wg1nm3#

如果您不需要确切的版本,我见过的一种助记策略是触摸文件时间戳。它可能不适合和/或您必须确定如何处理时间戳范围之外的数字。
例如,使用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资源管理器的“修改日期”列中。

相关问题