Maven 2.2.1声称支持版本范围(例如,参见http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-project-dependencies.html#pom-relationships-sect-version-ranges)
我从全新的Maven安装中尝试了以下pom:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>rangetest</artifactId>
<groupId>my.group</groupId>
<version>1.0</version>
<packaging>jar</packaging>
<description>test project containing one dependency, only</description>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
依赖关系应解析为junit 4.8.2,对吗?但是,版本4.8已解决:
C:\Users>mvn dependency:tree
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'dependency'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - my.group:rangetest:jar:1.0
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] my.group:rangetest:jar:1.0
[INFO] \- junit:junit:jar:4.8:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Thu Oct 07 14:30:40 CEST 2010
[INFO] Final Memory: 9M/23M
[INFO] ------------------------------------------------------------------------
您可能会认为Junit存在问题,因为4.8是现有版本,但事实并非如此。在我的项目中,我部署了从1.0.0到1.0.15的版本(没有1.0版!),但是mvn dependency:tree
抱怨缺少1.0版的工件。
这仅在您实际指定版本范围或时有效,如果您有多个POM。您使用的是4.8
,它是单个版本号,因此Maven尝试直接解决它。版本范围必须以[
或(
(分别包含和排除)开头。
根据您的情况,请尝试:[4.8,4.9)
这应该为您提供具有相同API的最高版本(即,修复了所有错误,但没有重大更改)。
此文档显示了Maven如何解释版本:https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html
第一行似乎支持您的职位(4.8
表示“至少4.8”),但有一个陷阱:如果有人特别要求,Maven只会选择更高的版本。因此,除非您的构建中有更多POM且其中一个要求4.8.2
,否则[M0]对于Maven来说“足够好”。
将其视为解决冲突的提示。如果POM A要求4.8,而B要求4.8.2,则B取决于A,则Maven必须做出决定。应该失败吗?应该使用4.8吗?还是4.8.2?规则通过选择4.8.2来解决此冲突,而没有给出警告或错误。
如果A要求4.8
,您会得到一个错误,因为Maven无法默默地将依赖项“升级”到4.8.2,并且肯定不能将4.8.2降级到4.8。
[4.8]
标签中似乎没有范围限定符。也许您打算使用以下内容要求版本4.8或更高版本: