我遇到了这个奇怪的问题,我不知道是什么问题。
我有一个多模块 java maven 项目,其结构如下:
+ A (parent)
+-+-B
| +--C
| +--D
我在父 pom (A) 中添加了一个依赖项:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
</exclusion>
</exclusions>
</dependency>
注意:A 以外的其他模块需要 1.8.5 版本
在模块 C 和 D 中,必须使用 2.3.0 版,因此我使用此依赖项覆盖了来自父 pom A 的 1.8.5 版:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
</exclusion>
</exclusions>
</dependency>
我在模块 C 和 D 的 poms 中添加了此依赖项。 C 也是 D 的依赖项。因此,当我尝试构建项目时,出现以下错误:
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for org.quartz-scheduler:quartz:1.8.5 paths to dependency are:
+-de.xxx.xxx.xxx:module-D:6.40.1-jat-SNAPSHOT
+-de.xxx.xxx.xxx:module-C:6.40.1-jat-SNAPSHOT
+-org.quartz-scheduler:quartz:1.8.5
and
+-de.xxx.xxx.xxx:module-D:6.40.1-jat-SNAPSHOT
+-org.quartz-scheduler:quartz:2.3.0
所以不知何故 maven 认为模块 C 的石英版本是 1.8.5 但我明确地将模块 C 的 pom 中的版本设置为 2.3.0
同样,当我在模块 C 的目录中运行 mvn dependency:tree -Dverbose 时,它似乎是正确的:[INFO] +- org.quartz-scheduler:quartz:jar:2.3.0:compile
有人有任何想法吗?
模块 A(父模块)的包装类型必须为pom
.
一般来说,在父 poms 中声明依赖项是一个坏主意,因为它强制所有子模块具有这些特定的依赖项,无论它们是否需要。它相当于在每个子模块中声明这些依赖项。
当模块 C 和 D 发挥作用时,您将拥有具有冲突版本的重复依赖项声明。
相反,模块 A 应该使用一个<dependencyManagement>
部分来声明依赖版本,而不强制每个子模块实际上依赖它们。
换句话说:
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
</exclusion>
</exclusions>
</dependency>
...
</dependencies>
</dependencyManagement>
模块 C 和 D 中的石英依赖声明将简单地覆盖父 A 中指定的版本。
其他依赖于托管石英库的模块仍然需要显式声明它:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
其中version
和exclusions
将从托管依赖项声明中获取。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句