Maven如何解决传递依赖的版本冲突?最近胜利战略

时间:2011-06-08 19:08:44

标签: dependencies version maven-3 transitive-dependency

我终于习惯了在我的项目中没有任何Used undeclared或Unused声明的依赖项。虽然很难跟踪依赖项中列出的未使用的声明的运行时/测试依赖项:analyze ...只需在pom.xml中向它们写入注释,否则管理它们以了解测试或运行时需要它们。 / p>

但解决版本冲突的方式对我来说仍然不清楚。关于传递依赖。

最近胜利策略如何运作?何时使用其他版本的版本?

  • 如果使用版本号声明Used undeclared依赖项 - 它总是胜出

  • 如果没有明确指定依赖版本,Maven无法解析任何版本 关于这种依赖性可能产生的冲突(很奇怪,但写成here

  • 如果您没有声明未声明的已使用依赖项,它会从最近的级别(最近获胜策略)中选择传递依赖项,如果冲突位于同一级别,则它会以某种方式决定版本A与版本B之间的关系......也许是第一个在处理权利时遇到的问题

2 个答案:

答案 0 :(得分:2)

我认为依赖项解析的工作方式与您描述的完全相同。

如果您将<scope>子标记用于<dependency>

,我也认为您的生活会更容易

引自maven官方网站:

  1. 编译: 这是默认范围,如果未指定,则使用此范围。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。
  2. 提供:这与compile非常相似,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。
  3. runtime此作用域指示编译不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。
  4. test:此范围表示正常使用应用程序不需要依赖关系,并且仅适用于测试编译和执行阶段。
  5. system:此范围与提供的类似,只是您必须提供明确包含它的JAR。工件始终可用,不会在存储库中查找。
  6. import :(仅适用于Maven 2.0.9或更高版本) 此范围仅用于节中pom类型的依赖项。它表示应该用POM的部分中的依赖项替换指定的POM。由于它们被替换,具有导入范围的依赖性实际上不参与限制依赖的传递性。

答案 1 :(得分:1)

有一些依赖关系管理文档的链接:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html (“依赖范围”部分中的importend表)

在德国期刊中有一篇神篇文章描述了依赖的解决方法 - 这里是文章的bibtex参考:http://www.bibsonomy.org/bibtex/2ef10bb1bc1be7806bc3fba53417bbd5f/funthomas424242

在sonatype书中有一个关于依赖插件的部分: http://www.sonatype.com/books/mvnex-book/reference/optimizing-sect-dependency-plugin.html

我希望它有用。