Maven排包指南

我们的大部分工作都是在维护老的应用或者在老应用上做开发,而在开发以及架构升级的的过程中,会不可避免的引入一些新的maven包。由于间接依赖冲突导致的应用启动失败情况屡见不鲜,问题的关键,就是找到关键的问题。那么如何更好的定位maven包的冲突点呢?

1. 排包方法

maven默认的包加载顺序;

第一原则:路径最短优先。

路径1:A->B->C->D(version1.0)

路径2:F->E->D(version2.0)

由于路径2的长度小于路径1,所以结果就是A会传递性依赖D(version2.0)

第二原则:先声明优先。

当路径长度相等的时候,使用第二原则: 路径1:A->B->C(version1.0)

路径2:D->E->C(version2.0)

由于路径1在路径2前面声明,所以结果就是D会传递性依赖C(version1.0)

排包方式:

一般情况下,我们是直接在根pom.xml文件中标签下进行排包,这样,整个应用的所有模块都会统一排包:

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>xxx</groupId>
                    <artifactId>xx</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
 </dependencyManagement>

2. 从启动日志入手

启动日志中一般会有报错信息:

找到报错信息最根上的caused by,之后在应用中全局搜索导致问题发生的类名,之后定位到类在哪个依赖包,这时我们往往会发现,应用中有两个同名不同版本的依赖包,将其从我们新引入的依赖中排除。

在这过程中,我们往往还需要借助如下的命令打印依赖树:

复制代码
mvn dependency:tree

3. 借助IDE工具

安装插件:MavenHelper

一些时候,尤其是在进行架构升级时,仅通过启动日志直接定位冲突点对于经验不丰富的新手是很困难的,这时我们可以采用一个更简单粗暴的方法,借助IDE工具直接定位二方包会冲突的依赖:

再筛选冲突包是,可以勾选上如下选项:

该工具可以显示出二方包下所有的间接依赖,之后我们可以排查哪个依赖与应用中已有的依赖有冲突。

最后,我们可以用最简单粗暴的方法,把冲突的包全都排掉~~

⚠️注意事项:

一些二方包可能自己和自己冲突,如果项目的其他位置并没有引入同名包的话,这种包是不能排除的(也不用排除):

相关推荐
葫芦和十三3 小时前
图解 MongoDB 02|BSON:你以为存的是 JSON,其实是带类型的二进制
后端·mongodb·agent
葫芦和十三3 小时前
图解 MongoDB 01|文档数据库
后端·mongodb·agent
陈随易5 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人7 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong7 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
Rust研习社9 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒9 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro10 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax11 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH11 小时前
Koa和Express的区别
后端