不同spring boot启动方式,线程上下文classloader加载问题

最近在做框架封装,类加强后加载到classloader时,发生
interface XXX is not visible from class loader 异常问题。

在eclipse中启动Main时,切正常,但打包或者用spring-boot:run启动时,就出错。
经过长时间摸索,发现是因为项目中的
spring-boot-devtools依赖,导致多个classloader加载。


通过Junittest​启动和Application启动项目得到的结果不一样,经排查,程序中调用了isAssignableFrom方法,发现同一个类A.isAssignableFrom(A)返回false,经过debug对比,发现虽然类A看起来是一样,但是通过不同的classloader加载的,一个是AppClassLoader,一个是restartClassLoader, 这样的话,底层便认为是两个不同的类A在比较。

     问题解决:​restartClassLoader是spring-boot-devtools这个包里面的,只是为了开发时热部署使用,弃用该包后程序运行正常。

猜你喜欢

转载自godlewis.iteye.com/blog/2412449
今日推荐