Java Maven依赖项收敛错误(使用了错误的版本)

Java Maven依赖项收敛错误(使用了错误的版本),java,maven,dependency-management,Java,Maven,Dependency Management,我有一个奇怪的问题,我不知道是什么问题 我有一个多模块java maven项目,其结构如下: + A (parent) +-+-B | +--C | +--D 我在父pom(a)中添加了依赖项: 因此maven认为模块C的quartz版本是1.8.5,但我在模块C的pom中明确地将版本设置为2.3.0 另外,当我在模块C的目录中运行mvn dependency:tree-Dverbose时,它似乎是正确的: [INFO]+-org.quartz调度程序:quartz:jar:2.3.0:com

我有一个奇怪的问题,我不知道是什么问题

我有一个多模块java maven项目,其结构如下:

+ A (parent)
+-+-B
| +--C
| +--D
我在父pom(a)中添加了依赖项:

因此maven认为模块C的quartz版本是1.8.5,但我在模块C的pom中明确地将版本设置为2.3.0

另外,当我在模块C的目录中运行mvn dependency:tree-Dverbose时,它似乎是正确的: [INFO]+-org.quartz调度程序:quartz:jar:2.3.0:compile


有人知道吗?

检查模块C的依赖关系层次结构并排除版本1.8.5(使用像eclipse这样的现代IDE,这应该很容易)。 或者,您可以从父pom中删除此依赖项,在依赖项管理中使用它,并在子模块中指示要使用的版本。父pom中的依赖项将由所有子模块继承。

模块A(父模块)的打包类型必须为
pom

通常在父POM中声明依赖项是一个坏主意,因为强制所有子模块都具有这些特定的依赖项,无论它们是否需要。它相当于在每个子模块中声明这些依赖项

当模块C和D起作用时,您就有了具有冲突版本的重复依赖项声明

相反,模块A应该使用
部分来声明依赖版本,而不强制每个子模块实际依赖它们

换言之:

<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>

...
org.quartz-scheduler
石英
1.8.5
com.mchange
c3p0
com.mchange
McChange commons java
...
然后,模块C和D中的quartz依赖项声明将简单地覆盖父级A中指定的版本

依赖于托管quartz库的其他模块仍需要显式声明它:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>

org.quartz-scheduler
石英

其中,将从托管依赖项声明中提取
版本
排除项

要使用或覆盖哪个版本,请将其放在“dependencyManagement”部分中。
[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
<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>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>