当前位置: 首页 > 科技观察

Maven中jar包冲突的原理及解决方法

时间:2023-03-14 17:48:18 科技观察

在实际开发中,多模块项目往往会使用Maven进行包管理。在poml文件中做包依赖的时候,往往会引入一个jar包,默认依赖其他jar包。这样很容易导致jar包冲突,导致一些奇怪的问题,比如因为版本问题找不到类和方法。下面我们就说说依赖冲突的原因、排查方法和解决方法。让我们举一个简单的例子来说明依赖转移的概念。例如,一个多模块项目的依赖如下图所示。其中bepe-dal引入了common-lib。在bepe-manager模块中引入bepe-dal时,common-lib的依赖也会被引入bepe-manager模块中。这就是依赖转移。依赖冲突的概念Dependencyconflict是指当一个模块中引入了很多jar包时,如果有两个groupId和artifactId相同但版本不同的jar包,这就是依赖冲突。那么申请的时候会使用哪个版本呢?这就是我们接下来要讨论的冲突解决方法。如何解决依赖冲突?最短路径原则DeclarationpriorityprincipleDependencyexclusion1.最短路径原则当存在groupId和artifactId相同但版本不一致的jar包冲突时,模块会自动选择路径最短的包。例如:bepe-manager到common-lib(1.0)的距离为2,bepe-manager到common-lib(2.0)的距离为1,则选择距离最短的common-lib(2.0),这就是最短路径原则。2.声明优先原则当冲突的包路径距离相同时,此时会按照它们在pom文件中声明的先后顺序。在manager模块pom.xml中,如果先引用bepe-common,则使用2.0版本的common-lib。com.company.bepebepe-common<版本>2.2om.company.bepebepe-dal2.23.依赖排除使用标签排除不需要依赖的包。这样我们就可以灵活选择了。但是如何找到冲突呢?接下来,我们将讨论如何解决依赖冲突问题。如何排查依赖冲突?我们可以使用一些插件工具来帮助找出冲突jar的具体位置。让我分享我在项目中排查和解决包冲突的两种方法。maven-enforcer-plugin插件MavenHelper插件1.maven-enforcer-plugin插件Maven提供了Maven-Enforcer-Plugin插件,用于验证协议是否符合,比较版本依赖的jar包等等。当规则检查失败时,构建将失败。(1)在pom.xml中引入插件规则是定义校验规则,通过配置可以实现重复依赖检测。它还支持自定义进行一些其他检查,例如版本检查。maven-enforcer-plugin插件规则的其他配置用法,有兴趣的朋友可以参考其相关资料。3.0.46.0!--是否检查传递依赖(间接依赖)-->truejunit:junitmustuseTestNG/bannedDependencies>(2)配置插件后,构建项目。当有包冲突时,会在控制台打印出来。(3)根据资料可以排除不需要的jar包。2.MavenHelper使用IntelliJIDE的Mavenhelper插件轻松查找和消除冲突的依赖(1)command+,打开工具的设置窗口(2)在设置搜索中输入plugin(3)在Marketplace中搜索MavenHelper表格页面,以及安装(4)重启后即可使用。打开pom文件后,文件下会有DependencyAnalyzer标签。进入DependencyAnalyzer视图后,有三个查看选项,分别是Conflicts(冲突)、AllDependenciesasList(列表形式查看所有依赖)、AllDependenciesasTree(以树结构查看所有依赖)。查看信息后,进行相应的依赖冲突处理。小结解决依赖冲突的方法有三种:最短路径原则、语句优先原则、依赖排除。在没有手动排除依赖的情况下,会根据最短路径原则和声明优先原则选择jar包。对于依赖冲突的排查,可以使用maven-enforcer-plugin、MavenHelper等插件。根据实际情况和环境,选择组合最优的方案解决依赖冲突问题。