发布于2026-07-09 阅读(0)
扫一扫,手机访问
LinkageError 真不是代码写错了——JVM 在链接阶段发现同一个类(比如 ja vax.servlet.http.HttpServletRequest)被两个不同 ClassLoader 加载成了结构不兼容的版本,字节码怎么都对不上,拒绝混用。编译顺利通过,运行时却直接崩了,问题就藏在类加载隔离与依赖叠加的细节里。

别急着动代码,先盯紧错误日志里的两句话:
如果报的是 NoClassDefFoundError 或 IncompatibleClassChangeError,也别只查 classpath。它们常是 LinkageError 的子表现,根源仍在加载冲突。
加几个 JVM 参数启动应用,让 JVM 自己“开口说话”:
servlet-api.jar 或 jsp-api.jar;Spring Boot 嵌入式容器要警惕 tomcat-embed-jasper 和外部容器 JSP API 的版本打架。90% 的 LinkageError 来自 Ma ven 依赖叠加。执行命令层层下钻:
commons-lang3 是否从多个路径引入,特别注意 compile 和 provided scope 混用。注意: 只能砍掉传递依赖,不能屏蔽你自己直接声明的依赖。比如你写了 spring-web,它带进来的老版 jakarta.annotation 就得手动排除或升级。
Tomcat 默认用 WebAppClassLoader,遵循双亲委派但允许打破——它优先加载 WEB-INF/classes 和 WEB-INF/lib,再委托给父加载器。问题常出在这里:
lib/ 放了 slf4j-api-1.7.36.jar,而 Tomcat 自带 slf4j-api-2.0.7.jar,两者不兼容 → 启动时可能不报错,但运行中调用新方法就抛 NoSuchMethodError。netty-buffer 不同版本 → 类加载器隔离本应生效,但若用了共享线程池或静态工具类,就可能跨应用污染。provided,确保只由容器提供;应用内只保留业务强依赖,版本由根 pom 统一锁定。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8