出于支持目的,我需要向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将具有如何命名和增加版本的逻辑