maven编译:Found duplicate... 问题的解决

2024-09-01 00:44

本文主要是介绍maven编译:Found duplicate... 问题的解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 问题描述

  • 一些开源的Java项目对依赖有着很严格的要求,会在root模块的pom.xml文件中,使用各种maven plugin检查依赖是否规范
    • apache的maven-dependency-plugin:可以检查是否存在unused dependency、used但未explicitly import的dependency等
    • org.basepom.mavenduplicate-finder-maven-plugin:可以查找和标记Java clapss上重复和冲突的class或resource
  • 最近的工作中,就因为引入新的依赖导致duplicate-finder-maven-plugin的检查未通过,关键信息如下
  • 仔细研读后,总结起来就是duplicate-finder-maven-plugin的检查不通过(虽然是WARNING信息)
    • 在complile、runtime、test classpath,都发现了 重复但相同的资源 char-whitelist.yaml,这个资源文件来自两个不同的依赖com.xxx.apm:config-loader:1.0.10com.xxx.metrics2:core:1.1.2
    • 在complile、runtime、test classpath,都发现了重复但不同的类 com.xxx.apm.shade.jnr.unixsocket.UnixSeqPacketChannel,这个资源文件来自两个不同的依赖com.xxx.metrics2:extension-exporter-unix-socket:1.1.2com.xxx:metrics4j:1.0.57
    [INFO] --- duplicate-finder-maven-plugin:1.5.1:check (default) @ onequery-common ---
    [INFO] Checking compile classpath
    [INFO] Checking runtime classpath
    [INFO] Checking test classpath[WARNING] Found duplicate (but equal) resources in [com.xxx.apm:config-loader:1.0.10, com.xxx.metrics2:core:1.1.2]:
    [WARNING]   char-whitelist.yaml
    [WARNING] Found duplicate and different classes in [com.xxx.metrics2:extension-exporter-unix-socket:1.1.2, com.xxx:metrics4j:1.0.57]:
    [WARNING]   com.xxx.apm.shade.jnr.unixsocket.UnixSeqPacketChannel
    [WARNING] Found duplicate classes/resources in compile classpath.[WARNING] Found duplicate (but equal) resources in [com.xxx.apm:config-loader:1.0.10, com.xxx.metrics2:core:1.1.2]:
    [WARNING]   char-whitelist.yaml
    [WARNING] Found duplicate and different classes in [com.xxx.metrics2:extension-exporter-unix-socket:1.1.2, com.xxx:metrics4j:1.0.57]:
    [WARNING]   com.xxx.apm.shade.jnr.unixsocket.UnixSeqPacketChannel
    [WARNING] Found duplicate classes/resources in runtime classpath.[WARNING] Found duplicate (but equal) resources in [com.xxx.apm:config-loader:1.0.10, com.xxx.metrics2:core:1.1.2]:
    [WARNING]   char-whitelist.yaml
    [WARNING] Found duplicate and different classes in [com.xxx.metrics2:extension-exporter-unix-socket:1.1.2, com.xxx:metrics4j:1.0.57]:
    [WARNING]   com.xxx.apm.shade.jnr.unixsocket.UnixSeqPacketChannel
    [WARNING] Found duplicate classes/resources in test classpath.
    
  • 按照之前暴力求解的方法,直接找到对应的依赖,从其所在的直接依赖中exclude掉任意一个就行
  • 结果,打包部署后发现服务无法运行,这时候只能静下心来研究duplicate-finder-maven-plugin

2. 解决办法

  • 官方文档:duplicate-finder-maven-plugin,github:basepom/duplicate-finder-maven-plugin
  • 官方文档内容很多,看得人心浮气躁,从github上发现了这个插件的源分支: Ning maven-duplicate-finder

    This plugin is a friendly fork (same main authors) of the Ning maven-duplicate-finder plugin. It is configuration compatible to the ning plugin; the only change required is the group and artifact id of the plugin itself.

  • Ning maven-duplicate-finder的REAME非常友好,很适合新手,这里列举一些简单的使用方式

2.1 完全跳过对某些依赖的check

  1. 在极少数情况下,需要完全跳过对某个依赖的check,这时可以使用<ignoredDependencies>标签(请在绝对必要时使用该标签
    <plugin><groupId>com.ning.maven.plugins</groupId><artifactId>duplicate-finder-maven-plugin</artifactId><version>1.1.0</version><configuration><ignoredDependencies><dependency><groupId>xml-apis</groupId><artifactId>xml-apis</artifactId><version>1.3.02</version></dependency></ignoredDependencies>...</configuration>
    </plugin>
    

2.2 跳过对依赖中某些类或资源的check

  • 一般冲突的是多个依赖中的重名类或资源,这时可以

    • 使用<conflictingDependencies>标签,指明冲突的依赖
    • 使用<classes>标签,指明可以跳过重复类
    • 使用<packages>标签,指明可以跳过的重复类的包名
    • 使用<resources>标签,指明可以跳过的重复资源
    • 使用<resourcePattern>标签,指明可以跳过的重复资源的正则表达式
    <plugin><groupId>com.ning.maven.plugins</groupId><artifactId>duplicate-finder-maven-plugin</artifactId><version>1.1.0</version><configuration><exceptions><exception><conflictingDependencies><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.1</version></dependency><dependency><groupId>xml-apis</groupId><artifactId>xml-apis</artifactId><version>[1.3.02,1.3.03]</version></dependency></conflictingDependencies><classes><class>org.w3c.dom.UserDataHandler</class></classes><packages><package>org.w3c.dom.ls</package></packages><resources><resource>log4j.xml</resource></resources><resourcePatterns><resourcePattern>files.*</resourcePattern></resourcePatterns></exception></exceptions></configuration>
    </plugin>
    

2.3 其他配置,如跳过duplicate检查

  • 文章开头的duplicate信息是WARNING级别,但maven编译也失败了,这是因为<failBuildInCaseOfConflict>为true,一旦遇到冲突就失败

  • 如果想偷懒,可以通过调整下面的配置项,使整个项目不进行check、跳过某些classpath的check、甚至在出现冲突时编译不失败等

  • 更多配置可以参考:Simple configuration

    <skip>false</skip>
    <checkCompileClasspath>true</checkCompileClasspath>
    <checkRuntimeClasspath>true</checkRuntimeClasspath>
    <checkTestClasspath>true</checkTestClasspath>
    <failBuildInCaseOfDifferentContentConflict>false</failBuildInCaseOfDifferentContentConflict>
    <failBuildInCaseOfEqualContentConflict>false</failBuildInCaseOfEqualContentConflict>
    <failBuildInCaseOfConflict>false</failBuildInCaseOfConflict>
    

这篇关于maven编译:Found duplicate... 问题的解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125462

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错