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

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

1. 实现原理

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

2. 配置方法

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

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


    yyyyMMddHHmmss
    v.${project.version} build ${maven.build.timestamp}

2.2 使用buildnumber-maven-plugin插件来帮助我们获取SVN版本号,并配置jar和war的打包插件参数,嵌入想要的信息。


    org.codehaus.mojo
    buildnumber-maven-plugin
    1.4
    
        
            validate
            
                create
            
        
    
    
        buildNumber
        unknown
        false
        false
        
            javasvn
        
    


    org.apache.maven.plugins
    maven-jar-plugin
    2.6
    
        
            
                ${buildTime}
                ${buildNumber}
            
        
    


    org.apache.maven.plugins
    maven-war-plugin
    2.6
    
        
            
                ${buildTime}
                ${buildNumber}
            
        
    

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



    scm:svn:http://127.0.0.1/dummy
    scm:svn:http://127.0.0.1/dummy
    HEAD
    http://127.0.0.1/dummy

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中)