把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中的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中jar包和war包的区别是

Jenkins自动化打包--war包

请问maven工程jar包,war包,pom打包,都是怎么定的?

Maven1

maven打包版本号问题

Jenkins + Tomcat + svn + maven 自动化构件简单过程