spring-boot-devtools 不同ClassLoader引起的问题

摘要:
这个服务的唯一特殊之处在于引入了准入的jar包,于是我根据依赖树,果然发现了一个模块Spring-boot-devtools,这是热部署模块,而这个模块的类加载器确实和普通的类加载器不同:一个RestartClassLoader,一个普通的AppClassLoader。。。。。解决方案:1.将jar包的类加载器改为热部署的类加载器2.服务中移除Spring-boot-devtools
问题场景:因业务需求,需要在请求到达接口时,进行IP获取。并且需要根据IP进行相关处理,由于其它系统有使用到的可能,于是在外部新创建了一个jar包,在该jar包中使用FeignClient的方式,调用业务接口,具体实现如下:
spring-boot-devtools 不同ClassLoader引起的问题第1张
然后在具体需要拦截IP的方法上,加上该注解。
然后再在启动类上,添加该jar包的扫描。
启动服务。
突然发现,服务启动失败,并提示 实例化CheckIpAspect失败,原因是,找不到DataSyncServiceApi这个Bean。按照往常的经验,是没有添加该Api的包扫描,于是去启动类检查。
但是,很不辛的是,@EnableFeignClients上是加了这个类的包扫描的。
那说明,不是包扫描的问题。
突然想起另一个服务也加了拦截IP的注解,于是抱着尝试的心态,启动了一下。结果居然成功了。
仔细对比两个启动类上的配置。
发现出问题的服务多了一个注解
@EnableCheckFeign ,这个注解是我们项目的准入系统的一部分。
于是我把这个注解去掉,发现还是相同的错误。
那么可以判定不是这个注解的原因。
于是我把jar包中的DataSyncServiceApi添加@Lazy 改为懒加载。
这次能成功启动了,我再调用加了注解的方法,这个时候抛出了一个异常,具体内容为:
interface ‘xxxxxxx’ is not visible from class loader
提示这个接口在类加载器加载之后 是不可见的
那是因为jar包中使用的类加载器和服务中使用的类加载器不同吗?
这个服务的唯一特殊之处在于引入了准入的jar包,于是我根据依赖树,果然发现了一个模块Spring-boot-devtools,这是热部署模块,而这个模块的类加载器确实和普通的类加载器不同:
一个RestartClassLoader,一个普通的AppClassLoader
。。。。。
由此也可以分析出,为什么不设置为懒加载时,会一直提示找不到DataSyncServiceApi,因为类加载器不同,不同的类加载器加载出来的文件互相不可见,此时jar包要使用服务中加载的类就无法获取到。
解决方案:
1.将jar包的类加载器改为热部署的类加载器
2.服务中移除Spring-boot-devtools

免责声明:文章转载自《spring-boot-devtools 不同ClassLoader引起的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇redis 系列22 复制Replication (下)在Docker中运行EOS(MAC版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

zookeeper 日志输出到指定文件夹

最近,我在学习ZookeperStormKafka。顺便说一下,我在本地建立了一个集群。我遇到了Zookeeper日志输出路径的问题。我发现设置log4j。Zookeeper中的属性无法解决日志路径问题。我发现解决方案如下:1.修改log4j属性,您应该能够更改它。我更改了红色粗体,但仍然没有生效。#定义要移动的默认值...

Cesium深入浅出之视频投影【转】

通常,我们使用矩形,因为视频形状是方形的。据怀疑,视频标签隐藏了这段关系。如果再次显示,视频将再次移动。此处使用VideoSynchronizer。它可以使视频元素与铯的模拟时钟同步。让我们看看它的构造函数:name type description optionsObject option子属性:name type默认值description用于驱动视频的...

解决微信公众平台接口配置信息配置失败问题

填写完URL和TOKEN后,当您单击“提交”时,系统将始终提示您“配置失败”或其他错误,以确认URL所指向的后台页面代码是否正常。请确认TOKEN配置是否正常。此时,请检查INDEX页面的编码格式,并将其更改为GB2312进行尝试,这可能会解决您的问题。我想把这篇文章献给我浮躁的自己。...

C# AES的128位、192位、256位加密

这里将不解释C#AES的128位、192位和256位加密原理。这里我们主要讨论AES的CBC加密模式中128位、192位和256位加密之间的差异,并参考对称加密和块加密的四种模式。16位密钥对应128位加密,24位密钥对应192位加密,32位密钥对应256位加密,矢量必须为16位。“);ifthrownewException(”指定的密钥长度不能小于16位。...

git使用说明

初次使用请参考百度,google,博客园。1修改文件并提交到github[luwenwei@dev01v~/git/helww/labs]$vimREADME[luwenwei@dev01v~/git/helww/labs]$gitdiffdiff--gita/READMEb/READMEindex39d8172..464c83f100644---a/REA...

uniapp之页面间传递和接收数组

uni-app如何在页面之前发送和传递数组?如果阵列是直接发送和传递的,则收到的消息如下所示。无法获取更多的对象值。接收数组对象的参数。您可以首先将数组转换为JSON字符串,然后在将其传递到页面后将其解析为JavaScript对象。...