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版本的工件。
发布于 2010-10-07 20:48:04
只有当你实际指定了一个版本范围或者你有多个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,否则4.8对于Maven来说“足够好”。
可以把它看作是解决冲突的一个提示。如果POM要求4.8,B要求4.8.2 ,而Maven B依赖于A,那么必须做出决定。如果它失败了呢?它应该使用4.8吗?还是4.8.2?
规则通过选择4.8.2来解决此冲突,而不给出警告或错误。
如果A请求[4.8],你会得到一个错误,因为Maven不能默默地“升级”依赖到4.8.2,当然也不能把4.8.2降级到4.8。
发布于 2010-10-07 22:12:08
如果要使用版本范围,请按照其他人所指出的那样指定版本范围。目前,你还不是。
但我真正的建议是不要在所有的上都使用版本范围,版本范围对于构建的再现性来说是一个糟糕的主意,你最不想看到的就是因为未知的原因而突然开始失败的构建。不要这样做,它们是一种糟糕的实践(这可能就是为什么版本范围不再有文档记录的原因)。
发布于 2020-05-12 21:24:30
在我的例子中,一切都正常,但是突然我得到了这个错误
No versions are present in the repository for the artifact with a range [x,y)我找到了.m2/repository文件夹中的库位置,并删除了整个文件夹。
如果您删除了某个特定版本的库的文件夹,它将不起作用,应该删除该库的所有版本的文件夹
另外,如果库是可传递的,则可能需要删除依赖路径中的所有库
希望这能对你有所帮助
https://stackoverflow.com/questions/3881694
复制相似问题