Spring Boot应用LaunchedURLClassLoader加载类时触发AssertionError求助
问题描述
我的Spring Boot应用在LaunchedURLClassLoader尝试加载类时,出现了意外的AssertionError。根据代码逻辑,该错误本不应出现,但问题无法稳定复现,已困扰我许久。
相关堆栈跟踪:
java.lang.AssertionError: Package org.apache.commons.lang3.exception has already been defined but it could not be found at org.springframework.boot.loader.LaunchedURLClassLoader.definePackageIfNecessary(LaunchedURLClassLoader.java:120) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:81) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:574) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:574) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
排查步骤与解决方案
- 检查依赖冲突:排查
commons-lang3相关依赖是否重复引入,或不同版本的commons-lang3被同时加载。用mvn dependency:tree(Maven)或./gradlew dependencies(Gradle)生成依赖树,排除冗余或冲突的依赖。 - 升级/回退Spring Boot版本:该问题可能与特定版本的Spring Boot Loader兼容性有关,尝试升级到最新稳定版,或回退到已知无此问题的版本。
- 检查自定义类加载逻辑:如果应用有自定义ClassLoader,确认其不会提前加载
org.apache.commons.lang3.exception下的类,避免干扰LaunchedURLClassLoader的正常工作。 - 验证打包配置:检查Spring Boot打包插件的配置,确保打包过程中没有包丢失或重复打包的情况。比如确认是否开启了可能影响依赖打包的配置项。
- 启用类加载日志:添加JVM参数
-verbose:class启动应用,记录类加载的详细过程。问题复现时,查看org.apache.commons.lang3.exception相关类的加载来源,定位冲突点。 - 排查多线程类加载场景:如果应用存在多线程同时加载类的情况,可能触发
LaunchedURLClassLoader的并发问题。尝试在类加载关键路径添加同步逻辑,或调整线程启动顺序,验证是否能缓解问题。
内容的提问来源于stack exchange,提问作者StackNow
相关产品推荐
相关产品推荐

