作者:syonChao
使用maven管理项目版本号
背景
经过一年的开发时间,采用spring MVC的框架创建的maven项目从最初的设立到目前的多功能的开发,经历了很多功能版本的迭代,但是之前一直忙于项目开发,并没有详细管理项目的分支以及tag,直到出现一个问题。
我们的项目于去年9月份上线生产环境,由于系统稳定运行,就一直没有跟随我们的项目升级,直到最近,生产环境有一个新的需求,不需要接入目前最新的项目版本(代价太大),只需要在之前代码的基础上新加一个功能即可,但是本人作为项目代码负责人有点慌,因为不记得当时用的代码是具体哪一个版本,不好拉取代码修改,针对这种教训,毅然决定管理好代码版本更迭。
前端展示或者接口查询项目版本号
查询以前的项目版本号,可以使用前端展示或者接口查询的方式,作为一个记录,原理是将项目的版本号写在配置文件(application.properties)中,java代码读取即可,但是每次更新版本,总觉得这样写比较low,因为pom文件中有项目的版本号,直接读取pom文件中的版本号不就可以了嘛。java能直接读取pom文件的内容吗?答案是:不可以,但是我们可以换一个方式,在maven构建项目的时候将pom文件中的版本号写入到配置文件中。
1. 在src\main\resources\application.properties放置如下内容
version=${project.version}
2. 配置pom.xml
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
3. maven构建项目
执行maven package,
查看生成的配置文件中的application.properties, version值已经变成了pom.xml中的version
新的问题
一个maven工程,如果只是一个单一的主项目,那么只要手动修改一下pom.xml就可以了,耗不了多少时间。但是如果这个maven项目有很多的子模块项目,那么一个个手动的去改就比较复杂了,如下图:
规范
1、同一项目中所有模块版本保持一致
2、子模块统一继承父模块的版本
3、统一在顶层模块Pom的节中定义所有子模块的依赖版本号,子模块中添加依赖时不要添加版本号
4、开发测试阶段使用SNAPSHOT
5、生产发布使用RELEASE
6、新版本迭代只修改顶层POM中的版本
如下两图,图一表示根目录pom文件,图二表示web模块pom文件,如果手动修改,则每次都需要修改父pom和各个子pom文件中版本号,很是复杂。
解决方案
在子目录中使用${project.version},但是这只针对于依赖的jar包,对于模块版本号没有作用。使用maven命令修改(很多文章说需要使用插件versions-maven-plugin),但是本人测试不使用插件也可以成功。
前提:maven安装成功
执行命令:
mvn versions:set -DnewVersion=2.3-SNAPSHOP
2.3-SNAPSHOP表示新的版本号,然后可以查看,各个模块已经更新了版本号。
附:versions-maven-plugin插件的使用
在父pom文件中添加
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<generateBackupPoms>false</generateBackupPoms>
</configuration>
</plugin>
</plugins>
</build>
总结
在项目代码中将版本号确定后,发布到环境,然后将该版本打tag,以后如果发现环境有bug(或者添加新功能),先查询该环境对应的项目版本号,然后根据该版本新建release分支,修改即可。