在SpringBoot中使用动态加载Class报ClassNotFoundException的问题


在SpringBoot中使用BeanUtils.forName(clazzName, classLoader)根据配置文件制定的类动态加载class,开发阶段在IDEA中运行没有任何问题,但是构建之后以jar包方式启动就死活无法启动了,错误提示找不到要加载的类,反复确认类实际上是存在的,所以一番查阅尝试后得知,是由于我错误的使用了ClassLoader.getSystemClassLoader()导致的问题。

打包后的springbootjar包中实际上包含了所有的第三方依赖包,所以是一个包含jar包的jar包,而java默认的Launcher.AppClassLoader无法加载这种jar in jar的jar包,所以springboot使用的是LaunchedURLClassLoader来加载类,而ClassLoader.getSystemClassLoader()返回的是系统(应用)类加载器-即AppClassLoader,自然找不到被打包到BOOT-INF/lib/xx.jar里面的class文件,所以换成Xx.class.getClassLoader()或者Spring提供的ClassUtils.getDefaultClassLoader()。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM