9.4.3. 依赖版本界限

你并不是必须为依赖声明某个特定的版本,你可以指定一个满足给定依赖的版本界限。例如,你可以指定你的项目依赖于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来解决冲突。