把SVN版本号编译时间信息自动打包到jar和war中
Posted 沙漠豪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把SVN版本号编译时间信息自动打包到jar和war中相关的知识,希望对你有一定的参考价值。
在部署程序包到生产环境运行后,有时发现程序问题,需要追查所使用的代码版本。如果版本管理工作做得不好,很可能就无法精确获知正在运行的版本究竟是哪个版本。
本文介绍一种在Maven打包时自动嵌入SVN版本号和打包时间的方法。
1. 实现原理
利用Maven的相关插件,自动获取当前代码所对应的SVN版本号信息,并最终把相关信息写入到打包文件的\\META-INF\\MANIFEST.MF中。
2. 配置方法
只需要修改pom文件即可实现。
2.1 在pom中添加定义属性,用于规定相关信息的格式,可自行调整。
<properties>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
<buildTime>v.$project.version build $maven.build.timestamp</buildTime>
</properties>
2.2 使用buildnumber-maven-plugin
插件来帮助我们获取SVN版本号,并配置jar和war的打包插件参数,嵌入想要的信息。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<buildNumberPropertyName>buildNumber</buildNumberPropertyName>
<revisionOnScmFailure>unknown</revisionOnScmFailure>
<doCheck>false</doCheck>
<doUpdate>false</doUpdate>
<providerImplementations>
<svn>javasvn</svn>
</providerImplementations>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifestEntries>
<buildTime>$buildTime</buildTime>
<SCM-Revision>$buildNumber</SCM-Revision>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifestEntries>
<buildTime>$buildTime</buildTime>
<SCM-Revision>$buildNumber</SCM-Revision>
</manifestEntries>
</archive>
</configuration>
</plugin>
2.3 添加一个虚拟的SVN服务器定义,否则上述插件不能正常工作。下面内容可直接使用,不需要改成实际的SVN地址。
注:节点与、节点是相同等级,并列的。
<!-- 虚拟的SCM配置,为buildnumber插件服务 -->
<scm>
<connection>scm:svn:http://127.0.0.1/dummy</connection>
<developerConnection>scm:svn:http://127.0.0.1/dummy</developerConnection>
<tag>HEAD</tag>
<url>http://127.0.0.1/dummy</url>
</scm>
3. 打包过程
Maven打包过程没有什么不同,但在打包前需要多做一项工作:**把当前项目的代码从SVN服务器上更新到最新版。**应该有插件能自动更新代码,但因为我不需要,没有进一步研究。
Tips:本方法使用的svn版本号是基于最近一次svn update所获得的,因此要特别注意,如果在打包机器上修改了代码并提交,虽然svn服务器会产生新的版本号,但本地的版本号还是上一次update时获得的。这种情况下,本方法记录下来的版本号也仍然是上一次的版本号。所以切记:如果打包机器有提交代码的话,一定要做一次svn update,才能确保记录的版本号正确。当然,如果使用自动构建的话,就不会有这个问题了。
4.结果确认
用压缩软件打开war或jar,查看\\META-INF\\MANIFEST.MF文件,应该可以看到版本号与时间信息。下面是一个例子:
Manifest-Version: 1.0
SCM-Revision: 3648
buildTime: v.0.0.1-SNAPSHOT build 20160818102925
Built-By: oldman
Build-Jdk: 1.7.0_55
Created-By: Apache Maven 3.0.5
Archiver-Version: Plexus Archiver
其中的SCM-Revision、buildTime,都是本方法自动产生的。
5. 最佳实践
如果要管理多个项目,每个都做相同配置比较繁琐。建议建立一个公共的虚拟父项目并配置好,子项目的pom通过标签指定父项目后就可以实现统一配置。更进一步,可以考虑建立公司或部门级的顶级父项目。
以上是关于把SVN版本号编译时间信息自动打包到jar和war中的主要内容,如果未能解决你的问题,请参考以下文章