系统重构:从Jar包冲突搞到类加载机制,就是这么霸气

本文介绍了在处理一个纯手动添加jar包的项目时遇到的Jar包冲突问题,以及如何通过调整JVM的类加载顺序进行临时解决。详细讲解了JVM的类加载机制,包括双亲委派模型、类加载器的隔离问题,并分析了Jar包冲突的常见表现。此外,还探讨了Tomcat启动时的Jar包加载顺序。
摘要由CSDN通过智能技术生成

接手了一套比较有年代感的系统,计划把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家。【重构01篇】,给大家讲讲Jar包冲突及原理。

背景

目前市面上项目管理要么是基于Maven,要么是基于Gradle,最近接手了一套纯手动添加jar包的项目。

对于纯手动添加jar包的项目已经是多年前的方式了,现在工作三五年的技术人员可能都没有经历过。就是把项目中所需的jar包挨个找出来,添加到一个lib目录中,在IDE中再将jar包依赖手动添加上。

这种方式来添加jar包依赖,不仅费事,而且很容易出现jar包冲突,同时分析冲突手段,只能凭借经验。

最近就遇到这样一种情况:一个项目在开发者A的环境中可以正常启动,在B那里就无法启动,而异常信息是找不到什么什么类。

稍微有一些开发经验的人,马上就可以断定是jar包冲突导致。下面就看看如何解决及引申出来的知识点。

临时解决方案

由于暂时无法对项目进行大范围重构,也不敢轻易将Jar包进行替换升级。只能采用临时的手段来进行解决。

这里总结几个步骤以备不时之需,通常也是解决Jar依赖问题的小技巧。

第一:在IDE中查找异常中找不到的类。比如IDEA MAC操作系统,我用的快捷键是command + shift + n。

系统重构:从Jar包冲突搞到类加载机制,就是这么霸气

查找冲突

以Assert类为例,可以看到有很多包都包含了Assert,但启动程序却报找不到该类的某个方法,问题基本上就出在Jar包冲突上了。

第二,定位到Jar包冲突之后,找到系统本应该使用的Jar包。

比如这里需要使用的spring-core中的类,而不spring.jar中的类。那么,就可以利用JVM的类加载顺序机制,让JVM先加载spring-core的jar包。

知识点:在同一目录下的jar包,JVM是按照jar包的先后顺序进行加载,一旦一个全路径名相同的类被加载之后,后面再有相同的类便不会进行加载了。

因此,临时解决方案就是调整JVM编译(加载)Jar包的顺序。这个在Eclipse和Idea中都有支持,可以手动进行调整。

Eclipse中调整方式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值