把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通過標籤指定父項目後就可以實現統一配置。更進一步,可以考慮建立公司或部門級的頂級父項目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章