Maven Pom 文件中的隐式依赖导致Jar冲突

本文介绍了在Maven项目中如何解决因多个日志框架引起的依赖冲突问题,通过排除特定依赖来确保项目的正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在maven项目中遇到这样一个场景:

    项目中的pom文件中,依赖了Spring-core,而Spring-core又隐式的依赖了commons-logging

    项目中同时配置了对定时任务quartz 包的依赖,而quartz又隐式依赖了slf4j。

这样项目中既有了commons-logging又有了slf4j。导致在log4j.properties里配置的mybatis的sql显示配置,一直没起作用,直到我查看maven dependencie中的jar包时,才发现项目既依赖了common-logging又引入了slf4j。后来通过排除quartz中的slf4j的依赖,就解决了上述冲突的问题:


<dependency>
				<groupId>org.quartz-scheduler</groupId>
				<artifactId>quartz</artifactId>
				<exclusions>
					<exclusion>
					    <groupId>org.slf4j</groupId>
					    <artifactId>slf4j-api</artifactId>
					</exclusion>
				</exclusions>
			</dependency>

以后该如何解决这种类似的问题呢。eclipse提供了对隐式依赖jar包的查看功能:在eclipse中打开一个pom文件,在Dependency Hierarchy的Tab页中,就可以查看当前pom文件中显示声明的jar包,及这些显示声明的jar中隐式引入的依赖jar包。



这样就可以查看有哪些隐式的依赖jar会导致jar包冲突了。

<think>我们注意到用户的问题中提到了一个现象:在pom.xml中没有配置maven-jar-plugin,却出现了错误。这通常是因为Maven有一个含的默认插件绑定,即使你没有在pom.xml中显配置maven-jar-plugin,Maven在构建时也会使用该插件生成主JAR包(即不带分类器的构件)。错误信息的关键点:```Failedtoexecutegoalorg.apache.maven.plugins:maven-jar-plugin:3.4.1:jar(default-jar)onprojectyudao-module-information-api:Youhavetouseaclassifiertoattachsupplementalartifactstotheprojectinsteadofreplacingthem.```这个错误发生在项目的“yudao-module-information-api”上,是在执行默认绑定(default-jar)的jar目标时出现的。错误原因:当我们试图通过maven-jar-plugin生成额外的JAR包时(比如配置了一个执行而没有指定分类器),就可能会覆盖主构件(即默认生成的JAR包)。Maven不允许这样做,因此强制要求使用分类器(classifier)来生成补充构件,以避免覆盖主构件。那么,为什么在pom.xml中没有配置这个插件却出现了错误呢?原因可能是:1.项目继承了父POM,而父POM中配置了maven-jar-plugin的额外执行(execution)但没有指定分类器。2.项目中的某个插件绑定(例如构建生命周期的某个阶段)间接触发了maven-jar-plugin的额外执行。如何排查?1.查看项目的完整有效POM(effectivepom)可以帮助我们了解所有插件的配置。运行命令:```mvnhelp:effective-pom```然后在输出的有效POM中搜索“maven-jar-plugin”的配置,看是否有额外的执行配置而没有指定分类器。2.检查是否有其他插件(如maven-assembly-plugin或maven-shade-plugin)的配置可能会影响构建,但错误信息明确指向了maven-jar-plugin。3.检查项目是否使用了Maven的默认绑定?错误中的执行ID是“default-jar”,这是Maven内置的生命周期绑定,用于生成主jar包。但是,当你在同一个项目中尝试生成多个jar包而没有使用分类器时,就会产生冲突。解决方案:如果确实是父POM或当前POM中有配置额外的jar生成(可能你没注意到),那么按照之前的建议,给额外的jar配置指定一个分类器。但是,如果用户并没有显配置生成额外的jar包,为什么会触发这个错误呢?有一种可能是,项目使用了多个模块,并且该模块是一个API模块,可能被设计为生成两个jar包(一个普通jar和一个sourcesjar或javadocjar)。而Maven的标准插件(如maven-source-plugin)会自动使用分类器(如'sources')。所以,通常不会冲突。因此,我们怀疑问题可能是由于项目中的某些特殊配置导致的。具体到这个项目(yudao-module-information-api),请检查是否在构建中指定了生成额外的jar包(例如,通过配置了多个资源目录,或者通过某种方指定了多个输出目录)?或者,有没有可能你在同一个项目中配置了两个maven-jar-plugin的执行,其中一个没有指定分类器?步骤总结:1.检查有效POM:运行`mvnhelp:effective-pom>effective-pom.xml`,然后搜索“maven-jar-plugin”。2.如果找到了多个执行,查看每个执行的配置,特别是是否有执行没有指定分类器,而且它的目标是在生成主jar包之外再生成一个jar包。例如,在有效POM中可能会看到类似这样的配置:```xml<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.4.1</version><executions><execution><id>default-jar</id>...<!--这是默认的执行,生成主jar--></execution><execution><id>another-execution</id><phase>package</phase><goals><goal>jar</goal></goals><configuration><!--这里缺少了classifier配置--></configuration></execution></executions></plugin>```这个第二个执行因为没有分类器,就会导致错误。修改方法:在第二个执行的配置中加入分类器。如果你没有配置第二个执行,那就要查看父POM或者Maven配置文件(如settings.xml)中是否有相关配置。另一个可能:项目结构中有多个包含编译代码的目录,并且被Maven误认为是需要多次打包?这不太常见,因为通常我们只使用一个输出目录(target/classes)。但是,如果项目中配置了多个资源目录,并且被识别为多个输出源,可能导致问题。如果以上都没有,那么可能是Maven的一个bug?但这种情况较少见,建议先检查配置。综上所述,请用户先检查有效POM,然后根据实际情况修改配置,确保所有额外的jar生成执行都指定了分类器。相关问题:1.Maven默认绑定(defaultbinding)的生命周期有哪些?2.如何查看Maven的完整有效POM?3.什么是Maven的插件执行(execution)?4.Maven中分类器(classifier)的作用是什么?</think> ## 🔍 理解错误原因与解决方案 ### 🔥 错误原因分析 这个错误 `You have to use a classifier to attach supplemental artifacts` 出现在 **即使没有显配置 `maven-jar-plugin`** 的情况下,通常有以下原因: 1. **父POM配置** - 项目继承的父POM可能包含配置了多个JAR生成的插件执行 2. **多模块构建冲突** - 如果 `yudao-module-information-api` 是子模块,其父模块可能配置了默认的打包机制 3. **自动插件绑定** - Maven生命周期自动绑定插件执行时会强制使用分类器规则 4. **多输出目录问题** - 项目可能有多个输出目录被识别,需要独立分类器标识 错误的核心机制是 **Maven的构件唯一性规则**[^1]: ``` 主构件:${project.artifactId}-${project.version}.jar → 无分类器 补充构件:${project.artifactId}-${project.version}-${classifier}.jar → 必须带分类器 ``` ### 🔧 解决方案步骤 #### 1. 排查父POM配置 检查项目的父POM,查找是否包含类似配置: ```xml <!--POM中可能有此类配置 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>extra-jar</id> <!-- 缺少 classifier 会导致此错误 --> </execution> </executions> </plugin> </plugins> </build> ``` #### 2. 添加必要分类器 在子模块中添加显分类器配置: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <id>api-jar</id> <goals><goal>jar</goal></goals> <configuration> <!-- 使用有意义的分类器名称 --> <classifier>api</classifier> </configuration> </execution> </executions> </plugin> ``` #### 3. 验证输出结构 执行命令检查构建结果: ```bash mvn clean package ls -l target/*.jar ``` 正确的输出应
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值