把SVN版本号、编译时间信息自动打包到jar和war中

在部署程序包到生产环境运行后,有时发现程序问题,需要追查所使用的代码版本。如果版本管理工作做得不好,很可能就无法精确获知正在运行的版本究竟是哪个版本。
本文介绍一种在Maven打包时自动嵌入SVN版本号和打包时间的方法。

1. 实现原理

利用Maven的相关插件,自动获取当前代码所对应的SVN版本号信息,并最终把相关信息写入到打包文件的\META-INF\MANIFEST.MF中。

2. 配置方法

只需要修改pom文件即可实现。

2.1 在pom中添加定义属性,用于规定相关信息的格式,可自行调整。

<properties>
	<maven.build.timestamp.format>yyyyMMddHHmmssmaven.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.mojogroupId>
	<artifactId>buildnumber-maven-pluginartifactId>
	<version>1.4version>
	<executions>
		<execution>
			<phase>validatephase>
			<goals>
				<goal>creategoal>
			goals>
		execution>
	executions>
	<configuration>
		<buildNumberPropertyName>buildNumberbuildNumberPropertyName>
		<revisionOnScmFailure>unknownrevisionOnScmFailure>
		<doCheck>falsedoCheck>
		<doUpdate>falsedoUpdate>
		<providerImplementations>
			<svn>javasvnsvn>
		providerImplementations>
	configuration>
plugin>
<plugin>
	<groupId>org.apache.maven.pluginsgroupId>
	<artifactId>maven-jar-pluginartifactId>
	<version>2.6version>
	<configuration>
		<archive>
			<manifestEntries>
				<buildTime>${buildTime}buildTime>
				<SCM-Revision>${buildNumber}SCM-Revision>
			manifestEntries>
		archive>
	configuration>
plugin>
<plugin>
	<groupId>org.apache.maven.pluginsgroupId>
	<artifactId>maven-war-pluginartifactId>
	<version>2.6version>
	<configuration>
		<archive>
			<manifestEntries>
				<buildTime>${buildTime}buildTime>
				<SCM-Revision>${buildNumber}SCM-Revision>
			manifestEntries>
		archive>
	configuration>
plugin>

2.3 添加一个虚拟的SVN服务器定义,否则上述插件不能正常工作。下面内容可直接使用,不需要改成实际的SVN地址。
注:节点与、节点是相同等级,并列的。


<scm>
    <connection>scm:svn:http://127.0.0.1/dummyconnection>
    <developerConnection>scm:svn:http://127.0.0.1/dummydeveloperConnection>
    <tag>HEADtag>
    <url>http://127.0.0.1/dummyurl>
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通过标签指定父项目后就可以实现统一配置。更进一步,可以考虑建立公司或部门级的顶级父项目。

你可能感兴趣的:(开发技术)