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



出于支持目的,我需要向Java库添加一个版本和构建标识符。该库本身是一个没有用户交互的工具包,用于不同的环境(独立的Java应用程序、web应用程序、Eclipse应用程序、Maven依赖项…)

我想要的是一个带有一些常量的类,这些常量可以为我提供上述信息(如MyAppVersion.BUILD,…),以便它们可以在对话框、命令行输出等中显示。经过我的研究,似乎有以下方法:

  • 为文件名添加版本控制,例如myLibrary-0.1.2.jar;在我们的情况下是不可行的,因为部署时我无法控制文件名
  • 将信息添加到MANIFEST.MF并以编程方式读取它,如这里所述。然而,我不确定这种方法对于不同的类加载器(Eclipse、OSGi、应用程序服务器等)有多健壮,如果JAR文件被重新打包,这些信息就会丢失
  • 如本文所述,使用包含版本的version.properties文件,并在构建期间使用脚本更新version.properties文件
  • 直接将版本信息硬编码到类中,并使用脚本更新此信息

还有其他方法吗?最后一种选择对我来说似乎最"稳健",有人反对这种变体吗?有没有一个Maven插件可以支持在构建过程中更新MyAppVersion.java文件中的这些信息?

我建议使用模板maven插件,它正是为此目的创建的。

您最多创建一个单独的模块,其中包含这样的模板类(或在您的模块中):

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文件中配置模板maven插件,如下所示:

<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插件相结合,创建需要添加到pom文件中的buildnumber,如下所示:

<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>

对版本进行硬编码的最后一个选项是最健壮的,这对您来说似乎很重要。如果您使用ant构建,您可以编写一个类(我们称之为VersionGenerator),它将生成一个版本为的java文件

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

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

最新更新