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中的顺序保持一致。 

相关推荐

  1. Mybatis Plus SQL分布在Jar包如何全部

    2024-07-23 01:46:04       47 阅读
  2. 时机及顺序

    2024-07-23 01:46:04       52 阅读
  3. SpringBoot 动态jar包,动态配置

    2024-07-23 01:46:04       41 阅读
  4. SpringBoot 动态jar包,动态配置

    2024-07-23 01:46:04       48 阅读
  5. springboot,配置过程

    2024-07-23 01:46:04       26 阅读
  6. springboot 抽出接口中都相同的代码的方法

    2024-07-23 01:46:04       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 01:46:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 01:46:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 01:46:04       45 阅读
  4. Python语言-面向对象

    2024-07-23 01:46:04       55 阅读

热门阅读

  1. 454. 四数相加 II

    2024-07-23 01:46:04       14 阅读
  2. windows update 1053

    2024-07-23 01:46:04       14 阅读
  3. HTML5+ push消息推送

    2024-07-23 01:46:04       13 阅读
  4. Composition API实现逻辑复用

    2024-07-23 01:46:04       13 阅读
  5. 云计算安全技术介绍

    2024-07-23 01:46:04       16 阅读