Java库的版本信息,在运行时可访问。

3
为了支持需要,我需要在我们的Java库中添加版本和构建标识符。该库本身是一个工具包,没有用户交互,并在不同的环境中使用(独立的Java应用程序,Web应用程序,Eclipse应用程序,Maven依赖项等)。
我想要的是一个带有一些常量的类,给我上述描述的信息(例如MyAppVersion.BUILD等),以便它们可以显示在对话框,命令行输出等中。根据我的研究,似乎有以下方法:
  • 将版本信息添加到文件名中,例如myLibrary-0.1.2.jar;但在我们的情况下不可行,因为我在部署时无法控制文件名。
  • MANIFEST.MF添加信息并以编程方式读取,如here所述。然而,我不确定这种方法在不同的类加载器(Eclipse、OSGi、应用程序服务器等)方面有多么健壮,如果JAR文件被重新打包,这些信息也会丢失。
  • 使用包含版本号的version.properties文件,如here所述,并在构建过程中使用脚本更新version.properties文件。
  • 直接将版本信息硬编码到类中,并使用脚本更新此信息。

还有其他方法吗?最后一个选项对我来说似乎最“强大”,是否有反对这个变体的意见?是否有Maven插件可以在构建期间支持更新MyAppVersion.java文件中的此信息?


这个答案提供了一种更简洁的方法来从清单中获取版本信息。简要概述:String version = this.getClass().getPackage().getImplementationVersion(); - Andrew Thompson
听起来像 https://dev59.com/eHE85IYBdhLWcg3wkkY8 - Rakesh KR
使用属性文件,并通过Maven过滤它,要求插入版本号。 - Boris the Spider
2个回答

3
我建议使用专门为此目的创建的模板-Maven-插件templating-maven-plugin

最好创建一个单独的模块,其中包含一个类似于下面的模板类(或在您的模块中):

public final class Version {

    private static final String VERSION = "${project.version}";
    private static final String GROUPID = "${project.groupId}";
    private static final String SVN = "${project.scm.developerConnection}";
    private static final String SVN_BRANCH = "${scmBranch}";
    private static final String REVISION = "${buildNumber}";

    public static String getVersion() {
        return VERSION;
    }

    public static String getGroupId() {
        return GROUPID;
    }

    public static String getSVN() {
        return SVN;
    }

    public static String getRevision() {
        return REVISION;
    }

    public static String getSVNBranch() {
        return SVN_BRANCH;
    }
}

你只需将其放入 src/main/java-templates 文件夹中,并添加一个适当的包名。此外,你需要在pom文件中按以下方式配置templating-maven-plugin:
   <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>templating-maven-plugin</artifactId>
        <version>1.0-alpha-3</version>
        <executions>
          <execution>
            <goals>
              <goal>filter-sources</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

这将生成一个名为 Version 的类,他可以被其他人使用,并包含给定的版本。在上述的模板类中,您可以使用任何可用于您的构建(例如 JENKINS_ID 等)或自己定义的东西的属性。
结果是该类被编译并打包到您的 jar 文件中。
除此之外,您还可以结合 buildnumber-maven-plugin 使用,以创建需要添加到 pom 文件中的构建编号,格式如下:
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
      <revisionOnScmFailure>UNKNOWN</revisionOnScmFailure>
      <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>create</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

太好了,看起来正是我想要的!谢谢你! - qqilihq

0

硬编码版本的最后一个选项似乎对您很重要,这是最稳健的选择。

如果您使用ant构建,可以编写一个类(我们称之为VersionGenerator),它将生成一个带有版本号的java文件:

package my.cool.package;
public interface Version {
    String VERSION = "1.2.3";
}

从ant中调用VersionGenerator,然后编译所有代码并将其打包成一个jar文件。你的jar文件将包含一个新生成和编译的Version.class!VersionGenerator将具有如何命名和增加版本的逻辑。


1
最好使用基于Maven的工具,如建议的templating-maven-plugin。 - khmarbaise
谢谢,但我正在使用Maven,khmarbaise的解决方案看起来非常完美! - qqilihq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接