springboot 多个jar下有相同全限定名类加载顺序
一、问题说明
项目中使用了密码机,应用系统需要集成密码机厂商的jar包。应用系统支持使用不同厂家的密码机,并且为了保证应用层代码不受影响,要求密码机厂商提供相同的类定义(全限定名),但不同密码机厂商提供的jar不同名,同时在集成时在工程中集成了所有密码机厂商的jar包,上层应用确定使用哪个厂商的jar。
假设A厂商的jar为a.jar,B厂商的jar为b.jar,其中有一个同名方法com.example.test.Cipher.enc(String plain, String key)。测试过程中本来应用想调用A厂家的enc方法,实际运行时调用的却是B厂家jar包中的enc方法,工程师问题排查了好几天,没有找到思路。
二、问题分析
首先让工程师把完整的流程走一遍,排除各环节中工程师臆测的原因,最后定位到在先加载的是B厂家的Cipher类,所以一直调用不到A厂家的密码机。那么为什么会出现这个问题呢?网上查了很多的资料,提到“springboot jar包方式运行时,加载类时是按照maven中的依赖顺序进行加载的,如果已经加载过某个类,则后依赖的jar包中有全限定类名相同的类时是不会被加载到的”,本着追根求源的原则,自己编写了代码进行验证。创建一个测试工程demo,然后开发了两个jar包,分别为example1.jar和example2.jar,在其中都包括com.test.exmaple类,并且有同名的方法hello,两个hello中输出不同的内容。第一次在pom.xml文件中,把example1.jar放在example2.jar前面,调用后看输出确实是调用的example1.jar中的同名方法,第二次把example2.jar方法example1.jar签名,调用后看出书确实是调用了example2.jar中的同名方法。同时为了确认加载的顺序确实与依赖一致,调用mvn dependency:tree查看,两次结果分别如下:
y与
与pom中的顺序保持一致。
原文地址:https://blog.csdn.net/zhangbaolin/article/details/134136910
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!