Scala(AKKA)运行时出现NoClassDefFoundError异常求助
看起来你已经做了基础的依赖配置,但运行时还是找不到org.apache.commons.codec.binary.Base64类,这个问题本质是编译时依赖可达,但运行时类路径中缺失对应的 jar 包,结合你的多模块项目配置,我给你几个具体的排查和解决方向:
1. 检查依赖传递性与多模块依赖树
你的firma项目依赖plugin模块,且firmaDependencies是pluginDependencies加上commons-codec,首先要确认依赖没有被意外排除。执行以下sbt命令查看firma项目的完整依赖树:
sbt firma/dependencyTree
在输出中找到commons-codec:commons-codec:1.10,确认它存在且没有被其他依赖覆盖成旧版本。如果发现有冲突的版本,可以用依赖强制配置锁定版本。
2. 强制锁定commons-codec版本,避免依赖冲突
项目中其他依赖可能引入了不同版本的commons-codec,导致运行时加载了不兼容的版本。在你的commonSettings中添加以下配置,强制整个项目使用你指定的1.10版本:
dependencyOverrides += "commons-codec" % "commons-codec" % codecVersion
3. 确认运行时类路径与打包配置
如果是用sbt run启动应用,sbt应该会自动加载依赖,但如果是打包部署,需要确保commons-codec被包含进去:
- 若使用
sbt assembly打包:检查assembly插件的配置,确认没有将commons-codec排除在外; - 若生成普通jar包:需要将
commons-codec-1.10.jar放到运行环境的类路径下,或者使用sbt dist生成包含所有依赖的分发包,这样部署时会自动带上所需依赖。
4. 验证依赖Scope的正确性
虽然你提到添加runtime关键字无效,但可以尝试显式指定scope为compile(默认就是compile,但多模块场景下可能存在隐式问题):
"commons-codec" % "commons-codec" % codecVersion % "compile"
compile scope会确保该依赖在编译和运行时都可用,应该能覆盖大部分场景。
快速验证方法
你可以在sbt控制台中执行firma/console,进入交互式环境后尝试:
import org.apache.commons.codec.binary.Base64 Base64.encodeBase64String("test".getBytes)
如果能成功执行并输出结果,说明sbt环境下运行时类路径是正常的,问题大概率出在部署打包环节;如果这里也报错,那就要回到依赖配置中排查是否有遗漏或冲突。
内容的提问来源于stack exchange,提问作者Rodrigo Ibaceta

