当前位置: 首页 > 知识库问答 >
问题:

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

刁星渊
2023-03-14

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

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

注:除

在模块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的pom中添加了这个依赖项。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的quartz版本是1.8.5,但我在模块C的pom中明确地将版本设置为2.3.0

同样,当我在模块C的目录中运行mvn dependency:tree-Dverbose时,它似乎是正确的:[信息]-org。quartz调度器:quartz:jar:2.3.0:编译

有人知道吗?

共有2个答案

刘阳荣
2023-03-14

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

后焕
2023-03-14

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

然后,模块C和D中的quartz依赖项声明将简单地覆盖父级A中指定的版本。

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

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

其中version排除将从托管依赖声明中获取。

 类似资料:
  • [错误]无法解析插件org.apache.cxf:cxf-java2ws-plugin:2.4.3-fuse-01-02或其依赖项之一:未能读取org.apache.cxf:cxf-java2ws-plugin:jar:2.4.3-fuse-01-02:无法在central(http://repo.maven.apache.org/maven2)中找到org.apache.cxf:cxf-java

  • 我在尝试使用“create”创建WebClient实例的线路上收到一个NoClassDefFoundError。尝试了builder(),但仍然是一样的。 请告诉我添加的依赖项有什么问题,以及如何解决这个问题。 我添加的依赖项是 StackTrace:

  • 我试图使用来自Java的Apache Beam作为某种数据管道。我写了一个简单的类,从谷歌Pubsub和下沉到谷歌Bigquery,但我不能让它为我的生活构建。我使用Maven构建并添加了我能找到的所有Beam包,但我仍然得到“未找到类文件”的错误。 具体来说: 有人知道我需要添加哪些包来解决这些问题吗?不幸的是,谷歌没有提供帮助。 我的POM文件是基于Apache为Wordcount提供的示例P

  • 为"mvn清洁验证"获取此错误。这个问题和https://github.com/googleapis/java-storage/issues/133?有人能帮忙解决吗?我没有改变pom.xml. [错误]未能执行目标org.apache.maven.plugins: maven-uderse-plugin: 3.0.0-M3:在项目hazelcast-分发上执行(执行工具):一些执行规则已经失败。

  • 我有两个Spring Boot项目,并希望使用其中一个作为MAVEN依赖在其他。 项目刮板取决于数据库项目 项目数据库包含数据库层(实体和DAO在此构建和测试) 在数据库项目中,我必须重写Hibernate版本,并按照选项2中https://spring.io/blog/2016/04/13/overriding-dependency-versions-with-spring-boot描述。 这很

  • 这里有几个关于Stackoverflow的问题,关于Kotlin编译器警告,当不同版本的Kotlin JAR在类路径中混合时。 这个问题是一个不同的问题,涉及到使用静态编程语言开发Gradle插件时的情况。当您至少有以下一项: 插件应用 plugin被应用 添加了依赖项 添加了依赖项 你有静态编程语言插件,如,例如: 你会出名的: 静态编程语言1.3.72是Gradle 6.7的嵌入式版本,静态编