我刚刚遇到了一个案例,即我的Maven项目有两个直接依赖项,其中有两个不同版本的特定传递性依赖项。
在我的特殊情况下,我直接依赖以下内容:
<dependency> <groupId>org.jclouds.driver</groupId> <artifactId>jclouds-sshj</artifactId> <version>${jclouds.version}</version> </dependency>
和
<dependency> <groupId>org.mule.modules</groupId> <artifactId>mule-module-jersey</artifactId> <version>${mule.version}</version> </dependency>
这两个依赖项都对com.sun.jersey:jersey- core具有(较深)的传递性依赖关系,但是每个都有不同的版本。Maven并没有失败,甚至没有警告(或者,如果没有,我从来没有看到过!)正在发生这样的事情……因此,直到调试了球衣版本时发生的问题,我才注意到它。由jclouds依赖引入的核心导致某些事情中断。
是否存在一个maven插件或其他工具可以检测到这种深度传递依赖重写,并在检测到此类冲突时至少警告用户(或使maven执行失败)…即使默认的maven行为是只是选择解决依赖性时出现的第一个版本?
使用Dependency Enforcer插件。当依赖关系无法正确收敛时,它将停止构建。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.0.1</version> <executions> <execution> <id>enforce</id> <configuration> <rules> <DependencyConvergence /> </rules> </configuration> <goals> <goal>enforce</goal> </goals> </execution> </executions> </plugin>