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

lis*_*sak 19 dependencies version maven-3 transitive-dependency

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

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

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

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

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

  • 如果你没有声明Undeclared使用的依赖关系,它会从最近的级别选择一个传递依赖关系(nearest-wins策略),如果冲突在同一级别上,那么它会以某种方式决定版本A和版本B之间...也许是第一个处理延迟的时候会遇到一个问题

Mah*_*eTo 2

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

<scope>我还认为如果您使用子标签来您的生活会更轻松<dependency>

引自maven官网:

  1. 编译:这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖关系会传播到依赖项目。
  2. 提供:这很像编译,但表示您希望 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 部分中的依赖项。由于它们被替换,具有导入范围的依赖项实际上并不参与限制依赖项的传递性。