如何不依赖构建工具用scalac编译含Spark依赖的Scala程序?
问题:scalac编译含Spark依赖的Scala程序无法找到依赖
待编译的Scala代码
import org.apache.spark.sql.SparkSession object Main { def main(args: Array[String]) { if (args.length < 1) { System.err.println("Usage: HDFStEST <file>") System.exit(1) } val spark = SparkSession.builder.appName("TesteHelena").getOrCreate() println("hellooo") spark.stop() } }
尝试过的编译命令及报错
- 命令:
scalac main.scala -cp C:\Spark\spark-2.4.0-bin-hadoop2.7\jars -d main.jar
报错:
main.scala:1: error: object apache is not a member of package org import org.apache.spark.sql.SparkSession
- 命令:
scalac main.scala -cp C:\Spark\spark-2.4.0-bin-hadoop2.7\jars\* org.apache.spark.sql.SparkSession -d main.jar
报错(每个jar包都出现类似错误):
error: IO error while decoding C:\Spark\spark-2.4.0-bin-hadoop2.7\jars\aircompressor-0.10.jar with UTF-8
- 命令:
scalac main.scala -cp org.apache.spark.sql.SparkSession -d main.jar
报错:
main.scala:1: error: object apache is not a member of package org import org.apache.spark.sql.SparkSession
解决方案
核心问题分析
- 命令1:
-cp指向jars目录时,scalac不会自动加载目录内的所有jar包,必须用通配符*指定。 - 命令2:Windows环境下未给通配符加引号,导致CMD将
*展开为所有jar文件名,scalac误将jar文件当作源码文件处理,引发解码错误;同时多余添加了类名参数,属于命令格式错误。 - 命令3:
-cp后直接写类名完全错误,类路径需指向jar文件或包含类文件的目录。
正确编译步骤
- 确认版本兼容:Spark 2.4.0对应Scala 2.11.x版本,确保使用的
scalac是2.11系列版本,避免兼容性问题。 - Windows环境下的正确编译命令:
在CMD中执行,注意给通配符加双引号,防止CMD自动展开:scalac -encoding UTF-8 main.scala -cp "C:\Spark\spark-2.4.0-bin-hadoop2.7\jars\*" -d classes-encoding UTF-8:指定编码,避免解码错误;-cp "...":正确指定所有Spark依赖jar包的路径;-d classes:将编译后的字节码输出到classes目录(可提前创建或让命令自动生成)。
- 打包成可执行jar(可选):
编译完成后,用jar命令将classes目录下的字节码打包成jar文件:jar cvf main.jar -C classes/ .
内容的提问来源于stack exchange,提问作者HSILS
相关产品推荐
相关产品推荐

