MAVEN项目版本号约定(根据运行环境选择不同依赖版本)

目的

在目前的微服务项目开发中,由于基础服务所提供依赖的版本不规范,在上线时踩过不少坑,为了解决这个问题,并且实现多环境构建时,根据不同环境切换不同版本的内部依赖,所以进行整理输出,意图规范项目的版本号管理,简化版本变动的操作,降低人工操作带来的风险。

说明

需要推送到私服被其他服务依赖的jar包,才需要进行版本变动,其他项目模块包括项目父pom,都是固定版本,暂定:0.0.1-SNAPSHOT,不进行版本变动。
同项目的模块依赖,在每次构建时会一起构建,也不需要进行版本变动。

约定

  • 推送到私服的jar包,需要保持精简,减少其他的内部依赖,原则上只包含服务接口声明和返回的数据模型类;
  • 开发环境使用0.0.1-SNAPSHOT,测试环境使用 1.0.0-SNAPSHOT,生产环境使用正式版本:X.Y.Z.RELEASE;
  • 开发环境可根据开发需要自行Deploy,测试和生产由专人Deploy,在提测后或发版前,进行推送。

项目配置

提供依赖的项目 B:
修改B 项目根目录的pom.xml,在中增加三个配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<profiles>
<!-- 本地开发环境 -->
<profile>
<id>Dev</id>
<properties>
<!--...-->
<test.api.version>0.0.1-SNAPSHOT</test.live.api.version>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>

<!-- 测试环境 -->
<profile>
<id>Test</id>
<properties>
<!--...-->
<test.api.version>1.0.0-SNAPSHOT</test.api.version>
</properties>
</profile>

<!-- 生产环境 -->
<profile>
<id>Deploy</id>
<properties>
<!--...-->
<test.api.version>1.1.1.RELEASE</test.api.version>
</properties>
</profile>

</profiles>

修改B 项目api 模块的版本:

1
2
3
4
<artifactId>test-api</artifactId>
<version>${test.api.version}</version>
<name>test-api</name>
<description>测试服务对外依赖</description>

使用依赖的项目 A:
修改A 项目根目录的pom.xml,在中增加三个配置,同时在 中增加对应的依赖,版本号为 profile.properties 中定义的版本号,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<profiles>
<!-- 本地开发环境 -->
<profile>
<id>Dev</id>
<properties>
<!--...-->
<test.api.version>0.0.1-SNAPSHOT</test.api.version>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>

<!-- 测试环境 -->
<profile>
<id>Test</id>
<properties>
<!--...-->
<test.api.version>1.0.0-SNAPSHOT</test.api.version>
</properties>
</profile>

<!-- 生产环境 -->
<profile>
<id>Deploy</id>
<properties>
<!--...-->
<test.api.version>1.1.1.RELEASE</test.api.version>
</properties>
</profile>
</profiles>

<dependencyManagement>
<dependencies>
<!--...-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>test-api</artifactId>
<version>${test.api.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

A 项目的具体引用到B 项目jar 包依赖的模块,无需指定版本,直接使用即可,如:

1
2
3
4
5
6
7
<dependencies>
<!--...-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>test-api</artifactId>
</dependency>
</dependencies>

操作

B项目推送依赖

• 开发环境:在项目根目录执行 mvn Deploy 或 mvn Deploy -PDev
• 测试环境:在项目根目录执行 mvn Deploy -PTest
• 生产环境:在开发分支时,即可修改模块 xx-live 的pom.xml 中的 Deploy 的 profile 节点,修改属性 xxx.api.version 版本为 最新版本,然后提交代码,合并代码到prod分支后,再切换到prod分支,接着在根目录执行:mvn Deploy -PDeploy

A项目使用依赖

• 在开发分支时,修改项目父pom.xml 中的 Deploy 的 profile 节点,修改属性 xxx.api.version 版本版本为 最新版本
• 构建时,同样需要使用参数-PTest,-PDeploy