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

相关文章:

  • 2022-12-23
  • 2021-11-29
  • 2021-11-12
  • 2021-05-08
  • 2022-12-23
  • 2021-10-28
  • 2021-12-27
  • 2021-11-25
猜你喜欢
  • 2022-12-23
  • 2021-05-29
  • 2021-12-12
  • 2021-08-14
  • 2021-07-26
  • 2021-11-09
  • 2021-07-05
相关资源
相似解决方案