← 中文资源

简体中文版本

Java 编译通过但运行时抛 NoClassDefFoundError

通过找出编译时存在的类在运行时为何缺失或初始化失败,修复 NoClassDefFoundError。

阅读英文原文

症状

程序能编译,但运行时对源码中明明存在的类抛 NoClassDefFoundError。要么该类在运行时类路径或 jar 中缺失,要么它的静态初始化更早已失败,而运行时把后续使用报告为缺类。区分两者很重要:更早的 ExceptionInInitializerError 指向初始化器而非打包。

诊断

用 jar tf 确认类是否在产物中;查看是否更早出现初始化错误;检查依赖 scope 是否为 runtime。

jar tf app.jar | grep Helper.class

根因

类在编译时可用但运行时不可用,原因或是运行时类路径中缺失,或是其静态初始化在更早的尝试中失败。

修复

把缺失依赖加入运行时类路径或 fat jar,修正依赖 scope,并修复导致类无法加载的静态初始化失败。

验证

再次运行构建产物确认类可加载,并确认日志中不再有更早的初始化错误。干净加载且无前置初始化失败才算修好。

常见陷阱

仅把依赖改为 provided 会把它移出运行时;应确保运行时确实包含所需依赖。