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

丹皮纳克

我遇到了这个奇怪的问题,我不知道是什么问题。

我有一个多模块 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

有人有任何想法吗?

史蒂夫·C

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

其中versionexclusions将从托管依赖项声明中获取。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Maven使用了错误的Java版本

来自分类Dev

Maven加载错误版本的依赖项

来自分类Dev

Webclient Maven依赖错误

来自分类Dev

空Maven依赖收敛报告

来自分类Dev

Maven将父依赖项管理与$ {project.version}一起使用会导致错误版本的依赖项

来自分类Dev

Maven的依赖插件:解包错误

来自分类Dev

Windows IntelliJ maven 依赖错误

来自分类Dev

Maven在错误的目录中查找依赖项

来自分类Dev

Maven:依赖项编译错误

来自分类Dev

Java依赖错误与Maven和Spring

来自分类Dev

Maven的依赖插件以错误的方式复制罐子

来自分类Dev

Maven:插件的错误解决版本

来自分类Dev

Maven:插件的错误解决版本

来自分类Dev

错误的Portlet版本和Maven部署问题

来自分类Dev

Maven、JavaFX 和类文件版本错误

来自分类Dev

Maven错误:“更新Maven项目”

来自分类Dev

Maven错误:“更新Maven项目”

来自分类Dev

Spring Boot Maven中某些依赖项的依赖项错误

来自分类Dev

Maven Build使用1.3错误

来自分类Dev

Maven解析版本的依赖项

来自分类Dev

所需的Maven依赖Java版本?

来自分类Dev

在Maven中测试依赖版本

来自分类Dev

Maven依赖版本作为属性

来自分类Dev

Maven多模块依赖版本

来自分类Dev

与旧版本的Maven依赖

来自分类Dev

Maven依赖冲突-更高版本

来自分类Dev

没有版本的Maven依赖

来自分类Dev

Maven依赖冲突-更高版本

来自分类Dev

Maven多模块依赖版本