Maven enforcer插件依赖收敛问题

发布时间 2023-07-11 23:07:23作者: easy16

当项目中引入新的jar包或者升级jar后,重新构建Maven项目时常出现这种报错:

Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M2:enforce (enforce-rules) on project xxx-xxxx: Some Enforcer rules have failed.

 

报错信息

 

 从报错信息看和Maven enforcer plugin有关,首先让我们了解一下Maven enforcer。

Maven enforcer是什么

Maven Enforcer插件是一个用于强制执行特定规则的Maven插件。它可以帮助您确保项目中的依赖项和构建环境符合特定的要求,例如强制使用特定版本的Java、强制执行依赖项收敛规则等。Maven Enforcer插件非常有用,可以确保项目的稳定性和可靠性。

Maven Enforcer插件提供了许多规则,可以根据需要进行配置。以下是一些常用的规则:

  • Require Java Version:强制要求使用特定版本的Java。
  • Require Maven Version:强制要求使用特定版本的Maven。
  • Require Plugin Versions:强制要求使用特定版本的插件。
  • Dependency Convergence:强制要求依赖项收敛,即确保项目中只使用一个版本的依赖项。
  • Banned Dependencies:禁止使用特定的依赖项。
  • Require Property:强制要求使用特定的属性。

 

从报错警告信息Dependency Convergence可知,maven-enforcer插件强制要求依赖项收敛时出错,即项目中有多个版本的依赖项。

对项目依赖项进行分析,可以使用mvn dependency命令,这里为了方便查看,使用Dependency Analyzer进行依赖分析。

Dependency Analyzer

Dependency Analyzer是一个开源的Java依赖项分析工具,它可以识别项目中的依赖项,以及这些依赖项之间的关系。使用Dependency Analyzer,可以更轻松地管理项目中的依赖项,并确保它们之间的兼容性和稳定性。

Dependency Analyzer具有以下主要功能:

  1. 识别依赖项:Dependency Analyzer可以扫描项目中的所有依赖项,并将它们列出。包括直接依赖项和传递性依赖项。
  2. 分析依赖项:Dependency Analyzer可以分析依赖项之间的关系,并确定它们之间的兼容性。
  3. 生成报告:Dependency Analyzer可以生成各种报告,例如依赖项列表、依赖项冲突报告等。

Maven-> Analyze Dependencies,点击show conflict only,发现guava的版本有冲突,分别是19.0和31.1-jre。

 或者选中pom.xml文件,点击Dependency Analyzer后选中Conflicts,也说明存在多个guava版本。

 

解决方法

  • 方法一是使用exclusion标签。通过在冲突的jar包的dependency内添加exclusion标签将其中引入的guava版本排除,一般是排除低版本,保留最新的。

  • 方法二是使用 Dependency Management

如果有多个模块或子项目,可以使用 Maven 的 Dependency Management 来集中管理依赖版本。在父项目的 <dependencyManagement> 标签中,指定所有共享依赖的版本。这样,子项目中的依赖可以直接使用指定的版本,而不必依赖传递性版本。

 

参考

https://maven.apache.org/enforcer/maven-enforcer-plugin/

https://stackoverflow.com/questions/16100315/solving-maven-dependency-convergence-issues

https://www.cnblogs.com/qyf404/p/4829327.html