为了支持目的,我需要在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
文件中更新此信息?
答案 0 :(得分:3)
我建议使用专为此目的而创建的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结合起来创建buildNumber,它需要像这样添加到你的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>
答案 1 :(得分:0)
硬编码版本的最后一个选项是最强大的,对您来说似乎很重要。 如果你使用ant构建,你可以编写一个类(我们称之为VersionGenerator),它将生成一个带有version的java文件:
package my.cool.package;
public interface Version {
String VERSION = "1.2.3";
}
从ant调用VersionGenerator 然后编译所有代码并将其滚动到jar中。而你的jar将包含一个新生成和编译的Version.class! VersionGenerator将具有如何命名和增加版本的逻辑