19

我终于习惯了在我的项目中没有任何已使用的未声明或未使用的已声明依赖项。尽管很难跟踪在依赖项中列出的未使用声明的运行时/测试依赖项:分析... 只需要在 pom.xml 中为它们写注释或以其他方式管理它们以了解测试或运行时需要它们。

但是解决版本冲突的方法我仍然不清楚。关于传递依赖。

最近获胜策略如何运作?什么时候使用一个版本而不是另一个版本?

  • 如果您使用版本号声明 Used 未声明的依赖项 - 它总是获胜

  • 如果没有明确指定依赖版本,Maven 无法解决任何可能出现的关于此依赖的版本冲突(很奇怪,但写在这里

  • 如果您没有声明未声明的已使用依赖项,它会从最接近的级别(最近获胜策略)中选择一个传递依赖项,如果冲突处于同一级别,那么它会以某种方式在版本 A 和版本 B 之间做出决定……也许是第一个处理依赖项时的一个胜利

4

2 回答 2

2

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

我还认为,如果您将<scope>子标签用于您的<dependency>

引用自maven官网:

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

有一些指向依赖管理文档的链接:

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

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

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

我希望它有帮助。

于 2012-01-12T22:15:10.397 回答