你并不是必须为依赖声明某个特定的版本,你可以指定一个满足给定依赖的版本界限。例如,你可以指定你的项目依赖于JUnit的3.8或以上版本,或者说依赖于JUnit 1.2.10和1.2.14之间的某个版本。你可以使用如下的字符来围绕一个或多个版本号,来实现版本界限。
- (, )
-
不包含量词
- [, ]
-
包含量词
例如,如果你想要访问JUnit任意的大于等于3.8但小于4.0的版本,你的依赖可以如Example 9.5, “指定一个依赖界限:JUnit 3.8 - JUnit 4.0”编写:
Example 9.5. 指定一个依赖界限:JUnit 3.8 - JUnit 4.0
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[3.8,4.0)</version> <scope>test</scope> </dependency>
如果想要依赖JUnit任意的不大于3.8.1的版本,你可以只指定一个上包含边界,如Example 9.6, “指定一个依赖界限:JUnit <= 3.8.1”所示:
Example 9.6. 指定一个依赖界限:JUnit <= 3.8.1
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[,3.8.1]</version>ex-de <scope>test</scope> </dependency>
在逗号前面或者后面的版本不是必须的,这种空缺意味着正无穷或者负无穷。例如,“[4.0,)”意思是任何大于等于4.0的版本,“(,2.0)”意思是任意小于2.0的版本。“[1.2]”意思是只有版本1.2,没有其它。
Note
当声明一个“正常的”版本如JUnit
3.8.2,内部它其实被表述成“允许任何版本,但最好是3.8.2”。意思是当侦测到版本冲突的时候,Maven会使用冲突算法来选择最好的版本。如果你指定[3.8.2],它意味只有3.8.2会被使用,没有其它。如果其它什么地方有一个版本指定了[3.8.1],你会得到一个构建失败报告,告诉你有版本冲突。我指出这一点是要让你知道有这一选项,但要保守的使用它,只有在确实需要的时候才使用。更好的做法是通过dependencyManagement
来解决冲突。