Scala打包运行报ClassNotFoundException问题求助
解决Scala打包后运行出现ClassNotFoundException的问题
核心问题分析
你遇到的问题本质是直接打包Scala源码而非编译后的字节码文件,同时Manifest配置和jar命令用法存在错误:
- JVM只能执行编译后的
.class文件,无法直接运行.scala源码 MANIFEST.MF中Main-Class的路径分隔符错误(应该用.而非/)- 未在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
相关产品推荐
相关产品推荐

