maven如何确定传递依赖的版本?
how does maven determine the version of transitive dependencies?
我正在使用 Maven 构建一个 java 项目,我注意到在其中一个子项目中,包含了 jsonwebtoken 0.7.0。
https://github.com/WebGoat/WebGoat/blob/develop/webgoat-lessons/challenge/pom.xml
然后从maven repo (https://repo1.maven.org/maven2/io/jsonwebtoken/jjwt/0.7.0/jjwt-0.7.0.pom), jsonwebtoken 0.7.0 依赖jackson-databind v2.8.2;
然而,当我从 maven 调试日志中跟踪时,jackson-databind v2.10 实际上是由 maven 拉取的。
我理解如果一个组件的版本没有明确定义在POM中,maven会默认为最新版本,但是,在上面的情况下,为什么maven仍然选择覆盖版本到最新版本?
谢谢!
我猜你有某个依赖项需要 jackson-databind 2.10。高版本强制maven覆盖jsonwebtoken要求的jackson-databind 2.8.2
但是,如果您在另一个版本的项目中明确包含 jackson-databind,则该版本会覆盖传递依赖项中的版本。
如果你使用eclipse,可以查看"Dependency Hierarchy."。举个例子,如果你显式地包含 jackson-databind:
.. 在这里,如果你有两个依赖项,它们都包含不同版本的传递依赖项(在这种情况下 spring-aop: spring-boot-starter-security wants 5.0. 4.RELEASE,但由于 spring-boot-starter-weg 到 5.1.5.RELEASE):"updated":
如果在多个地方添加了一个依赖项,Maven 会选择一个:
- 在层次结构中更接近您的pom.xml(传递依赖与传递依赖的传递依赖)
- 如果深度相同 - 第一次出现。
为了保证使用哪个版本,您需要在 <dependencyManagement>
部分声明它。这会覆盖传递依赖项中声明的任何内容。
if a component version is not explicitly defined in POM, maven would default to latest
不,您不能在没有显式版本的情况下定义依赖项。虽然 Maven 支持范围,但它们被认为是不好的做法,因为这会导致不可重复的构建。
我正在使用 Maven 构建一个 java 项目,我注意到在其中一个子项目中,包含了 jsonwebtoken 0.7.0。
https://github.com/WebGoat/WebGoat/blob/develop/webgoat-lessons/challenge/pom.xml
然后从maven repo (https://repo1.maven.org/maven2/io/jsonwebtoken/jjwt/0.7.0/jjwt-0.7.0.pom), jsonwebtoken 0.7.0 依赖jackson-databind v2.8.2;
然而,当我从 maven 调试日志中跟踪时,jackson-databind v2.10 实际上是由 maven 拉取的。
我理解如果一个组件的版本没有明确定义在POM中,maven会默认为最新版本,但是,在上面的情况下,为什么maven仍然选择覆盖版本到最新版本?
谢谢!
我猜你有某个依赖项需要 jackson-databind 2.10。高版本强制maven覆盖jsonwebtoken要求的jackson-databind 2.8.2
但是,如果您在另一个版本的项目中明确包含 jackson-databind,则该版本会覆盖传递依赖项中的版本。
如果你使用eclipse,可以查看"Dependency Hierarchy."。举个例子,如果你显式地包含 jackson-databind:
.. 在这里,如果你有两个依赖项,它们都包含不同版本的传递依赖项(在这种情况下 spring-aop: spring-boot-starter-security wants 5.0. 4.RELEASE,但由于 spring-boot-starter-weg 到 5.1.5.RELEASE):"updated":
如果在多个地方添加了一个依赖项,Maven 会选择一个:
- 在层次结构中更接近您的pom.xml(传递依赖与传递依赖的传递依赖)
- 如果深度相同 - 第一次出现。
为了保证使用哪个版本,您需要在 <dependencyManagement>
部分声明它。这会覆盖传递依赖项中声明的任何内容。
if a component version is not explicitly defined in POM, maven would default to latest
不,您不能在没有显式版本的情况下定义依赖项。虽然 Maven 支持范围,但它们被认为是不好的做法,因为这会导致不可重复的构建。