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