RvP*_*vPr 5 java jar dependency-management maven
当我运行时mvn dependency:tree -Dverbose,我看到以下内容:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ reddit_digest ---
...
[INFO] +- com.rajivprab:sava:jar:1.2.0:compile
[INFO] | +- com.rajivprab:cava:jar:1.5.0:compile
[INFO] | | +- org.apache.commons:commons-lang3:jar:3.5:compile
...
[INFO] | | \- com.google.guava:guava:jar:20.0:compile
Run Code Online (Sandbox Code Playgroud)
这是非常令人惊讶的,因为cava 工件指定了 guava version-22。
如果我继续添加 guava version-22 作为对我的项目的直接依赖项,然后mvn dependency:tree -Dverbose再次运行,我现在会看到以下内容,其中 cava 的 guava 版本神奇地固定为应有的值 (22)。
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ reddit_digest ---
...
[INFO] +- com.google.guava:guava:jar:22.0:compile
[INFO] +- com.rajivprab:sava:jar:1.2.0:compile
[INFO] | +- com.rajivprab:cava:jar:1.5.0:compile
[INFO] | | +- org.apache.commons:commons-lang3:jar:3.5:compile
...
[INFO] | | \- (com.google.guava:guava:jar:22.0:compile - omitted for duplicate)
Run Code Online (Sandbox Code Playgroud)
是什么导致番石榴传递依赖版本以如此意外的方式表现?
在 cava 上运行依赖树:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ cava ---
....
[INFO] com.rajivprab:cava:jar:1.5.0
[INFO] +- com.google.guava:guava:jar:22.0:compile
....
[INFO] \- com.google.truth:truth:jar:0.33:test
[INFO] +- (com.google.guava:guava:jar:20.0:test - omitted for conflict with 22.0)
Run Code Online (Sandbox Code Playgroud)
在 sava 上运行依赖关系树,并查找 guava 的所有实例:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ sava ---
[INFO] com.rajivprab:sava:jar:1.2.0
[INFO] +- com.rajivprab:cava:jar:1.5.0:compile
...
[INFO] | \- com.google.guava:guava:jar:22.0:compile
...
[INFO] +- com.google.truth:truth:jar:0.33:test
[INFO] | +- (com.google.guava:guava:jar:20.0:test - omitted for conflict with 22.0)
...
[INFO] +- org.glassfish.jersey.media:jersey-media-multipart:jar:2.25.1:compile
[INFO] | +- org.glassfish.jersey.core:jersey-common:jar:2.25.1:compile
[INFO] | | +- (javax.ws.rs:javax.ws.rs-api:jar:2.0.1:compile - omitted for duplicate)
[INFO] | | +- javax.annotation:javax.annotation-api:jar:1.2:compile
[INFO] | | +- org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.25.1:compile
Run Code Online (Sandbox Code Playgroud)
我的maven版本:
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-03T15:39:06-04:00)
Maven home: /usr/local/Cellar/maven/3.5.0/libexec
Java version: 1.8.0_92, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.5", arch: "x86_64", family: "mac"
Run Code Online (Sandbox Code Playgroud)
小智 4
v22 为三级深,v20 为两级深。Maven 的依赖调解选择“最近的定义”,即 v20。
依赖关系中介 - 这决定了当遇到工件的多个版本时将使用哪个版本的依赖关系。目前,Maven 2.0 仅支持使用“最近的定义”,这意味着它将使用依赖项树中与您的项目最接近的依赖项的版本。您始终可以通过在项目的 POM 中显式声明来保证版本。请注意,如果两个依赖项版本在依赖项树中处于相同深度,则在 Maven 2.0.8 之前,尚未定义哪个版本将获胜,但自 Maven 2.0.9 起,重要的是声明中的顺序:第一个声明获胜。
“最近的定义”意味着使用的版本将是依赖树中最接近您的项目的版本,例如。如果 A、B 和 C 的依赖关系定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,则构建 A 时将使用 D 1.0,因为从 A 到 D 的路径通过E 较短。您可以在 A 中显式添加对 D 2.0 的依赖项以强制使用 D 2.0
这个SO答案可以为您提供有关依赖中介策略背后原因的更详细解释:/sf/answers/3021595671/
您有两个简单的选择:
| 归档时间: |
|
| 查看次数: |
1869 次 |
| 最近记录: |