重点: LaunchedURLClassLoader;了解类加载器的基本常识
项目为springboot项目,资源和主包分离打包。大体如下:
-- application.jar 应用jar包
-- resources: 资源文件
-- lib:第三方jar
报错class not found:
Class.forName(className)
className
为主包中的对象小伙伴跟我反馈的问题是,在本地开发中都是好的,但是发布到测试环境就包这样的错了。
首先从以下几个方便简单确认了下:
这个class类所在的包为主包,猜测应该是不在一个classLoader中,
断点简单跟了一下,发现Class.forName中获取到classloader为“AppClassLoader”,
而主应用的class被加载到的是类加载器为LaunchedURLClassLoader, 两者不在一个classPaths.。 所以找不到该类。
Class.forName(className)
修改为
Thread.currentThread().getContextClassLoader().loadClass(className)
关于springboot,现在小伙伴们使用的比较多。 可能偶尔会出现一下开发环境没有问题,但是打包部署后就出出现一些问题的情况,特别是资源分离打包的情况下。
个人建议,这种情况下首先应该看看主jar包里的“MANIFEST.MF” 文件, 它包含了该包的所有情况,网上资料很多,此处不再赘述。
另外,关于springboot的类加载器LaunchedURLClassLoader
,网上资料也很多,我随手就搜到一个Java classLoader spring LaunchedURLClassLoader, 有兴趣可以看看。
—— by 临窗旋墨
20220427