1.目前问题
目前由于都是用的snapshot快照版本,并且有些版本没设置版本号,导致加大了引起生产事故的风险,同时也会让maven构建变慢,所以我们需要对现在jar的版本进行规范化
2.我们内部的版本升级建议
我们将所有的二方库的包都使用父类的版本来管理,为了方便,都统一用父类的版本号。
例如:
父类:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxxxx.frame</groupId>
<artifactId>frame</artifactId>
<version>1.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>frame</name>
kafka框架:
不设置版本号,用父类的版本号
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.xxxxx.frame</groupId>
<artifactId>frame</artifactId>
<version>1.1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>frame-kafka</artifactId>
<packaging>jar</packaging>
所以frame
下面的所有air-xxx-client
,frame-async-download
等子模块的版本都是1.1.0-SNAPSHOT
。
优化
当前为了方便好管理,都是将所有的子jar版本都统一成一个版本号,在父pom里管理。
之所以都公用一个父版本号是前期为了方便管理,也方便修改。
1.开发阶段
例如frame-kafka
的这个包目前的版本是1.1.0
,这个是已经发布的正式的jar包。同时父类的frame:com.xxxx.frame
的版本也肯定是1.1.0
这个时候有了一个新的需求需要对frame-kafka
修改,那我们就拉了一个新的分支,然后将父类frame:xxxx.frame
这个的版本号改成1.1.1-SNAPSHOT
。
此时父类的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxxxx.frame</groupId>
<artifactId>frame</artifactId>
<version>1.1.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>frame</name>
frame-kafka-xxxxx
的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.xxxxx.frame</groupId>
<artifactId>frame</artifactId>
<version>1.1.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>frame-kafka</artifactId>
<packaging>jar</packaging>
这里就是将我们的父类由1.1.0
改成1.1.1-SNAPSHOT
。
同时我们也需要将其他在frame下面的项目的<parent>
都改成1.1.1-SNAPSHOT
那在我们开发阶段,我们都是使用当前版本的快照版本,例如:
<dependency>
<groupId>com.xxxxxx.frame</groupId>
<artifactId>frame-kafka</artifactId>
<version>1.1.1-SNAPSHOT</version>
</dependency>
升级原则:当前生产的版本升级一版本并且改成SNAPSHOT
2.提测阶段
这个时候,我们仍然是用SNAPSHOT
版本,因为如果在提测过程中我们就改成正式版本的话,一旦有bug需要修改,那这样版本号就会升级的的很快。
3.测试通过,准备上线阶段
这个时候,基本上没什么需要修改了,代码是不会再改动了。那就可以把SNAPSHOT
去掉,重新打包,同时依赖方也需要去掉SNAPSHOT
,重新打包。
这个阶段就不允许有除修改版本号的外的代码提交了。
如果去掉了SNAPSHOT
,并且已经构建二方库了,但是仍然有bug,那就得回到提测阶段,同时这个版本号得再次升级成下一个版本的SNAPSHOT
。
例如:我们从1.0.0
改成了1.1.0-SNAPSHOT
,开发完成了,然后准备上线,同时把1.1.0-SNAPSHOT
改成了1.1.0
正式版本。这个时候构建好了,也放在测试环境了,就等发版本了。但是发现有个代码上的bug,那这个时候就需要将1.1.0
改成1.1.1-SNAPSHOT
,同时依赖的地方也需要修改。等真正测试完没问题了,再改成1.1.1
,然后上线。
例子
frame-kafka
当前master分支为1.1.0
父类pom也为1.1.0
开发阶段:1.1.0
-> 1.1.1-SNAPSHOT
提测阶段:仍然 1.1.1-SNAPSHOT
上线阶段: 1.1.1-SNAPSHOT
-> 1.1.1
其他
1.对于三方库如果提供的是SNAPSHOT版本,我们就得让对方提供正式版本,如果没有的话,我们就没办法修改了。
2.对于版本升级频繁的jar,我们的小版本可以设置大点比如1.1.0
可以一直升级到1.1.8
再到1.1.50
,这样一直改下去。
工具使用
由于每次升级都需要改版本,可以使用maven专门的修改版本的插件
点versions:set,然后这里输入版本即可
这样就会把所有依赖父模块的版本都改了