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

Scala打包运行报ClassNotFoundException问题求助

解决Scala打包后运行出现ClassNotFoundException的问题

核心问题分析

你遇到的问题本质是直接打包Scala源码而非编译后的字节码文件,同时Manifest配置和jar命令用法存在错误:

  1. JVM只能执行编译后的.class文件,无法直接运行.scala源码
  2. MANIFEST.MF中Main-Class的路径分隔符错误(应该用.而非/)
  3. 未在Manifest中声明Scala标准库依赖,运行时无法加载Scala核心类

分步解决方案

1. 先编译Scala源码

使用scalac编译所有相关的Scala文件(包括依赖的类,比如EndpointDataLoader),指定输出目录存放编译后的.class文件:

# 创建target目录存放编译产物
mkdir -p target
# 编译core目录下所有Scala文件+根目录的Constants.scala
scalac -d target core/*.scala Constants.scala

2. 修正MANIFEST.MF配置

修改META-INF/MANIFEST.MF,注意Main-Class用.分隔包名和类名,同时添加Scala标准库的依赖路径:

Manifest-Version: 1.0
Main-Class: core.LoadSymbol
# 确保scala-library.jar和你的jar在同一目录,或者填写完整路径
Class-Path: scala-library.jar

提示:可以通过scala -cp . scala-library.jar找到本地Scala库的路径,替换上面的scala-library.jar为完整路径(比如/usr/share/scala/lib/scala-library.jar)

3. 正确打包编译后的字节码

使用jar命令打包target目录下的.class文件,而非源码文件:

jar -cvfm myJar.jar META-INF/MANIFEST.MF -C target/ .

参数说明:

  • -C target/:临时切换到target目录,打包该目录下的所有文件(即编译后的类)
  • .:表示打包target目录下的所有内容

4. 运行jar包

确保scala-library.jar和myJar.jar在同一目录,执行:

java -jar myJar.jar

纠正你之前的错误操作

  • 错误1:直接打包.scala源码文件 → JVM无法识别,必须打包编译后的.class
  • 错误2:java -jar命令不能同时指定-classpath → -jar模式会忽略命令行的classpath配置,必须在Manifest中声明Class-Path
  • 错误3:MANIFEST.MF中Main-Class用core/LoadSymbol → 正确格式是core.LoadSymbol(包名和类名用.分隔)
  • 错误4:jar -cvfm myJar.jar core/LoadSymbol.scala → 参数顺序错误,-cvfm后应该是jar名、manifest文件、要打包的内容,你把源码文件当成了manifest,导致无效头字段错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:12:22