框架版本号的设计

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-clientframe-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专门的修改版本的插件


image.png

点versions:set,然后这里输入版本即可


image.png

这样就会把所有依赖父模块的版本都改了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Version:发布版本号,可以通过App Store、itunes或其它软件看到,是给用户看的,如当前上架版本为...
    ibiaoma阅读 7,887评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 概览 做好版本迭代有助于项目管理 。本文将讲述个人相关理解与实践,包括 snapshot 和 realease 版...
    milai阅读 251评论 0 0
  • 版本号的命名 SemVer 根据国际主流的惯例,我们使用「语义化版本(Semantic Versioning)」的...
    zfylin阅读 1,127评论 0 0
  • 1.简介 versions-maven-plugin插件可以管理项目版本,特别是当Maven工程项目中有大量子模块...
    木木与呆呆阅读 14,307评论 4 15