maven依赖范围无法正常工作

问题描述 投票:3回答:4

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版的工件。

maven-2 dependencies range
4个回答
7
投票

这仅在您实际指定版本范围时有效,如果您有多个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。


6
投票
如果要使用版本范围,请像其他人指出的那样指定版本范围。目前,您还不是。

2
投票
[4.8]标签中似乎没有范围限定符。也许您打算使用以下内容要求版本4.8或更高版本:

0
投票
就我而言,一切正常,但突然我收到了此错误
© www.soinside.com 2019 - 2024. All rights reserved.