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

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。

    1. 在项目根目录的project/plugins.sbt文件中添加插件配置,若文件不存在则手动新建:
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.5")
    
    1. 在项目根目录的build.sbt中补充配置,指定项目信息、Scala版本和入口主类:
    name := "HelloWorld"
    version := "0.1"
    scalaVersion := "2.13.12" // 替换为你本地编译使用的实际Scala版本
    assembly / mainClass := Some("Main")
    
    1. 执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:42:23