Java maven中的重复直接依赖项

Java maven中的重复直接依赖项,java,maven,maven-3,Java,Maven,Maven 3,我特意想看看maven是否允许重复的直接依赖项(即非传递依赖项),因为它使用依赖项中介来解决冲突的传递依赖项 这是我在pom.xml中写的 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version>

我特意想看看maven是否允许重复的直接依赖项(即非传递依赖项),因为它使用依赖项中介来解决冲突的传递依赖项

这是我在pom.xml中写的

  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>


  </dependencies>
如果您看到我们在pom.xml中提到两个junit时与
org.hamcrest:hamcrest-core
有冲突。它应该选择
org.hamcrest:hamcrest核心:jar:1.3
,因为首先提到的是4.11。但事实并非如此。它选择了JUnit4.10和org.hamcrest:hamcrest核心:jar:1.1


我使用的是最新的ApacheMaven 3.6.3。

为什么您会对此感到惊讶


它可能总是最后一个。尽可能避免这种情况(我能看到的唯一用例是更改父POM中定义的依赖项)。

为什么您会惊讶地看到这种情况


它可能总是最后一个。尽可能避免这种情况(我能看到的唯一用例是更改父POM中定义的依赖项)。

我不确定此信息的准确性,但:

在声明“正常”版本(如Junit的3.8.2)时,在内部 这表示为“允许任何事情,但更喜欢3.8.2。”这意味着 当检测到冲突时,允许Maven使用 选择冲突算法的最佳版本。如果您指定 [3.8.2],这意味着只使用3.8.2,而不使用其他内容。如果 在其他地方有一个指定[3.8.1]的依赖项,您可以 得到一份关于冲突的报告。我们指出这一点 让你意识到这个选项,但要谨慎使用,并且只有在真正需要的时候才使用 需要。解决此问题的首选方法是通过dependencyManagement

资料来源:第35页


因此,通常给出一个没有范围的版本(使用圆括号或方括号)只是提示您喜欢使用的内容,而不是Maven必须遵守的内容。

我不确定这些信息的准确性,但是:

在声明“正常”版本(如Junit的3.8.2)时,在内部 这表示为“允许任何事情,但更喜欢3.8.2。”这意味着 当检测到冲突时,允许Maven使用 选择冲突算法的最佳版本。如果您指定 [3.8.2],这意味着只使用3.8.2,而不使用其他内容。如果 在其他地方有一个指定[3.8.1]的依赖项,您可以 得到一份关于冲突的报告。我们指出这一点 让你意识到这个选项,但要谨慎使用,并且只有在真正需要的时候才使用 需要。解决此问题的首选方法是通过dependencyManagement

资料来源:第35页


因此,通常给定一个没有范围的版本(使用圆括号或方括号)只是提示您喜欢使用什么,而不是Maven必须遵守的东西。

我很惊讶,因为根据依赖项中介,它选择了一个路径最短的版本来实现它。在路径相等的情况下,由直接依赖生成的第一条路径将获得优先级。如果我们扩展这个原则来解决重复情况下的直接依赖,那么应该选择4.11。但这不是结果。好的,你有这方面的来源吗?From,
“最近的定义”意味着使用的版本将是最接近你的项目的版本….
,但你的两个依赖项都在同一级别上,因此,它们没有一个比另一个更接近。它写在它的顶部-
注意,如果两个依赖关系版本在依赖关系树中处于相同的深度,那么第一个声明将获胜。
我很惊讶,因为根据依赖关系中介,它选择了路径最短的一个来实现它。在路径相等的情况下,由直接依赖生成的第一条路径将获得优先级。如果我们扩展这个原则来解决重复情况下的直接依赖,那么应该选择4.11。但这不是结果。好的,你有这方面的来源吗?From,
“最近的定义”意味着使用的版本将是最接近你的项目的版本….
,但你的两个依赖项都在同一级别上,因此,它们没有一个比另一个更接近。它写在它的顶部-
注意,如果两个依赖版本在依赖树中的深度相同,则第一个声明获胜。
首先它应该产生一个警告…@khmarbaise,正确。它确实会产生一个警告-
[warning]“dependencies.dependency.(groupId:artifactId:type:classifier)”必须是唯一的:junit:junit:jar->version 4.11 vs 4.10@line 30,column 17
这已经是一个提示,在您的构建中确实存在一些错误…应该加以修复…首先它应该产生一个警告…@khmarbaise,正确。它确实会产生一个警告-
[warning]“dependencies.dependency.(groupId:artifactId:type:classifier)”必须是唯一的:junit:junit:jar->version 4.11 vs 4.10@line 30,第17列
这已经暗示了在您的构建中确实存在一些错误…应该加以修复。。。
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ PracticeMaven ---
[INFO] org.example:PracticeMaven:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.10:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.1:test

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ PracticeMaven ---
[INFO] org.example:PracticeMaven:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test