maven指定版本号范围写法

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

上述代码是我们在使用maven依赖某一个jar包时最常见的写法,其中version指定了jar包的版本为1.18.8。但是在一些项目中我们可以看到如下写法:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>[1.18.8,1.18.12]</version>
</dependency>

version的位置变成了中括号加逗号的形式,那这样是什么意思呢?意思是在1.18.8-1.18.12的范围内的jar包都可以使用,默认使用最大版本的即1.18.12

完整的版本号范围说明如下:(x为具体使用的版本号)

(,1.0]          x <= 1.0
[1.0]           x = 1.0 跟直接指定1.0没有区别
[1.2,1.3]       1.2 <= x <= 1.3
[1.0,2.0)       1.0 <= x < 2.0
[1.5,)          x >= 1.5
(,1.0],[1.2,)   x <= 1.0 or x >= 1.2
(,1.1),(1.1,)   x < 1.1 or x > 1.1 即排除1.1的版本

那么假如此时存在快照版本和非快照版本呢?默认情况下,同版本的快照版本会小于非快照版本。如:

[1.0-SNAPSHOT,1.0]  如果1.0不存在则使用1.0-SNAPSHOT,1.0存在则使用1.0版本
[1.0,1.0-SNAPSHOT]  错误,会提示:Reason: Range defies version ordering

现在流行微服务,微服务之间就经常会有各种jar包互相引用,在开发一个新的需求如1.1的需求时,开发阶段使用的是快照版本。我们的maven依赖版本就可以写成[1.1-SNAPSHOT,1.1]这样因为我们1.1版本的jar还没发布,所以项目会使用1.1-SNAPSHOT。当项目开发完成上线的时候,打包了1.1版本,依赖的项目打包的时候发现1.1版本的jar存在了则会使用1.1版本的jar。免去上线的时候需要修改pom的麻烦。也避免上线的时候因为忘记修改版本号导致线上版本依赖到快照版本。

当然还有另外一种办法是使用maven的profile将各个环境的版本号区分开,但是我觉得比较麻烦。具体的使用还是见仁见智吧。