首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maven依赖项范围不能按预期工作

maven依赖项范围不能按预期工作
EN

Stack Overflow用户
提问于 2010-10-07 20:39:08
回答 3查看 7K关注 0票数 3

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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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版本的工件。

EN

回答 3

Stack Overflow用户

发布于 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。

票数 7
EN

Stack Overflow用户

发布于 2010-10-07 22:12:08

如果要使用版本范围,请按照其他人所指出的那样指定版本范围。目前,你还不是。

但我真正的建议是不要在所有的上都使用版本范围,版本范围对于构建的再现性来说是一个糟糕的主意,你最不想看到的就是因为未知的原因而突然开始失败的构建。不要这样做,它们是一种糟糕的实践(这可能就是为什么版本范围不再有文档记录的原因)。

票数 6
EN

Stack Overflow用户

发布于 2020-05-12 21:24:30

在我的例子中,一切都正常,但是突然我得到了这个错误

代码语言:javascript
复制
No versions are present in the repository for the artifact with a range [x,y)

我找到了.m2/repository文件夹中的库位置,并删除了整个文件夹。

如果您删除了某个特定版本的库的文件夹,它将不起作用,应该删除该库的所有版本的文件夹

另外,如果库是可传递的,则可能需要删除依赖路径中的所有库

希望这能对你有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3881694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档