You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sbt run运行Akka HTTP服务正常,执行jar包时出现NoClassDefFoundError错误

解决Akka HTTP服务Jar包运行时SLF4J依赖缺失问题

嘿,这个问题我碰到过好多次了——你用sbt run能正常跑,但打出来的Jar一运行就报NoClassDefFoundError: org/slf4j/LoggerFactory,核心原因很简单:默认sbt publishLocal生成的是瘦Jar(thin jar),只包含你自己写的代码,没把Akka、SLF4J这些第三方依赖打包进去;而sbt run的时候,sbt会自动把所有依赖都加到类路径里,所以运行毫无问题。

下面给你几种靠谱的解决方案,按推荐程度排序:

方案一:用sbt-assembly打胖包(Fat Jar)

这是最直接的方式,把所有依赖和你的代码打包成一个独立的Jar,直接就能运行:

  1. 先在project/plugins.sbt里添加assembly插件(可以用最新版本,这里给个稳定版参考):
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")
  1. 在build.sbt里指定你的主类(如果之前没配置的话):
mainClass in assembly := Some("com.rogers.profileauthn.StartProfileAuthService")
  1. 执行打包命令:
sbt assembly
  1. 生成的胖包会在target/scala-<你的Scala版本>/目录下,命名类似myservice-assembly-<你的版本号>.jar,直接用java -jar运行这个包就搞定了。

方案二:用sbt-native-packager生成规范的可执行包(推荐)

这个插件比assembly更灵活,能生成带依赖的压缩包、启动脚本,甚至系统安装包,适合生产环境:

  1. 在project/plugins.sbt添加插件:
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.9.16")
  1. 在build.sbt里启用Java应用打包配置:
enablePlugins(JavaAppPackaging)
mainClass := Some("com.rogers.profileauthn.StartProfileAuthService")
  1. 生成包含依赖的可执行包:
    • 如果想生成zip压缩包(解压后直接用启动脚本运行):
    sbt universal:packageBin
    
    压缩包在target/universal/目录,解压后bin/文件夹里的脚本直接就能启动服务。
    • 如果只想生成带依赖的Jar:
    sbt javaPackageJar
    
    生成的Jar在target/java-packaging/目录,运行时会自动处理依赖类路径。

方案三:手动指定类路径(不推荐,太繁琐)

如果不想用插件,你可以手动把所有依赖Jar收集到一个目录(比如lib/),然后运行时指定完整类路径:

java -cp "myservice.jar:lib/*" com.rogers.profileauthn.StartProfileAuthService

但这种方式需要自己整理所有依赖,后续依赖更新还要手动同步,非常麻烦,只适合临时测试用。

总结一下:优先用sbt-native-packager做生产环境的包,快速测试用sbt-assembly打胖包,绝对别手动搞类路径,太折腾人。

内容的提问来源于stack exchange,提问作者Turtle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:42:16