在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()。

posted @ 2021-04-29 17:48  毛宁  阅读(2179)  评论(0编辑  收藏  举报