我有一个 Maven 构建的 Java 应用程序,它引入了许多库。该应用程序位于一个 git 存储库中(具有其自己的 Maven 构建),每个库位于其自己的 git 存储库中(具有其自己的 Maven 构建)。此外,应用程序和一些库都依赖于 guava。
应用程序的 pom.xml 指定 guava 版本 19.0:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
</dependencies>
该应用程序还导入另一个库,称为library1。 Library1 还依赖于番石榴。但library1的pom.xml指定了更高版本的guava:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
</dependencies>
构建应用程序时,maven 选择在应用程序级别指定的 guava 版本。但这导致library1失败,因为它需要更高版本的guava。
如果我们一直使用 Grade 并尝试指定番石榴版本的这种组合,我相信 gradle 会导致构建失败,这可能是正确的做法。
考虑到我们的 pom.xml 文件可能存在这样的版本差异,是否有一种方法可以设置 Maven,以便它能够注意到差异并导致构建失败或显示有关该问题的真正显着的警告?
要检测所有传递依赖项,您可以使用maven-dependency-plugin
:
mvn dependency:tree -Dverbose
它将显示您的项目的直接和传递依赖关系。这-Dverbose
选项显示冲突。
[INFO] [dependency:tree]
[INFO] org.apache.maven.plugins:maven-dependency-plugin:maven-plugin:2.0-alpha-5-SNAPSHOT
[INFO] +- org.apache.maven.reporting:maven-reporting-impl:jar:2.0.4:compile
[INFO] | \- commons-validator:commons-validator:jar:1.2.0:compile
[INFO] | \- commons-digester:commons-digester:jar:1.6:compile
[INFO] | \- (commons-collections:commons-collections:jar:2.1:compile - omitted for conflict with 2.0)
[INFO] \- org.apache.maven.doxia:doxia-site-renderer:jar:1.0-alpha-8:compile
[INFO] \- org.codehaus.plexus:plexus-velocity:jar:1.1.3:compile
[INFO] \- commons-collections:commons-collections:jar:2.0:compile
对于同一库不同版本的选择:
依赖调解——这决定了工件的版本
当遇到多个版本作为依赖项时将被选择。
Maven 选择“最接近的定义”。也就是说,它使用的版本
依赖关系树中与您的项目最接近的依赖关系。
您始终可以通过在您的文件中明确声明它来保证版本
项目的 POM。请注意,如果两个依赖版本相同
在依赖树的深度中,第一个声明获胜。
“最近的定义”意味着所使用的版本将是依赖关系树中最接近您的项目的版本。例如,
如果 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。
因此,如果您的库之一无法与其他版本的番石榴一起使用,则意味着您的依赖项不兼容。应该更新它以适用于较新的版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)