Java maven中的重复直接依赖项
我特意想看看maven是否允许重复的直接依赖项(即非传递依赖项),因为它使用依赖项中介来解决冲突的传递依赖项 这是我在pom.xml中写的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>
<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