Scala代码sbt package打包的jar执行失败报NoClassDefFoundError
错误原因
sbt package命令默认生成的轻量jar包仅包含当前项目自行编写的代码编译后的字节码,不会嵌入Scala标准库等运行时依赖。
报错java.lang.NoClassDefFoundError: scala/Function0的核心原因是:JVM运行时找不到Scala标准库中定义的Function0类。你编写的入口类继承了Scala提供的App特质,该特质的实现依赖Scala标准库的函数定义、运行时逻辑等一系列类,这些类不属于JDK自带的基础类,直接通过java -jar执行时JVM无法在默认类路径下扫描到对应类,就会触发类缺失错误。
修复方案
可根据实际场景选择以下任意一种方案解决:
方案1:打全依赖胖jar(推荐,无额外运行环境要求)
使用sbt-assembly插件将项目代码、Scala标准库及所有依赖打入同一个独立可执行jar,生成的jar可直接在装有对应版本JDK的环境运行,无需提前安装Scala。- 在项目根目录的
project/plugins.sbt文件中添加插件配置,若文件不存在则手动新建:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.5")- 在项目根目录的
build.sbt中补充配置,指定项目信息、Scala版本和入口主类:
name := "HelloWorld" version := "0.1" scalaVersion := "2.13.12" // 替换为你本地编译使用的实际Scala版本 assembly / mainClass := Some("Main")- 执行
sbt assembly命令完成打包,生成的jar存放在target/scala-<对应Scala版本>/目录下,进入目录执行java -jar <生成的jar文件名>.jar即可正常输出结果。
- 在项目根目录的
方案2:运行时手动指定类路径
如果不希望将依赖打入jar包,可在执行命令时手动把Scala标准库加入类路径,该方案要求运行环境提前安装和编译时版本完全一致的Scala:- Linux/macOS 环境执行:
java -cp "$SCALA_HOME/lib/*:HelloWorld.jar" Main- Windows cmd 环境执行:
java -cp "%SCALA_HOME%\lib\*;HelloWorld.jar" Main其中
SCALA_HOME为本地Scala的安装根目录。方案3:使用scala命令直接运行默认jar
如果本地已经安装了对应版本的Scala,可直接使用scala命令执行sbt package生成的jar,scala命令会自动加载所需的Scala运行时依赖,无需额外配置类路径:
scala HelloWorld.jar
内容的提问来源于stack exchange,提问作者Mikecraft1224
相关产品推荐
相关产品推荐

