症状
程序能编译,但运行时对源码中明明存在的类抛 NoClassDefFoundError。要么该类在运行时类路径或 jar 中缺失,要么它的静态初始化更早已失败,而运行时把后续使用报告为缺类。区分两者很重要:更早的 ExceptionInInitializerError 指向初始化器而非打包。
诊断
用 jar tf 确认类是否在产物中;查看是否更早出现初始化错误;检查依赖 scope 是否为 runtime。
jar tf app.jar | grep Helper.class
根因
类在编译时可用但运行时不可用,原因或是运行时类路径中缺失,或是其静态初始化在更早的尝试中失败。
修复
把缺失依赖加入运行时类路径或 fat jar,修正依赖 scope,并修复导致类无法加载的静态初始化失败。
验证
再次运行构建产物确认类可加载,并确认日志中不再有更早的初始化错误。干净加载且无前置初始化失败才算修好。
常见陷阱
仅把依赖改为 provided 会把它移出运行时;应确保运行时确实包含所需依赖。