Maven构建Apache Spark项目运行时报NoClassDefFoundError:SparkConf如何解决
错误原因
你遇到的NoClassDefFoundError是因为默认执行mvn package生成的jar包仅包含你自己编写的项目代码,不会把pom.xml中声明的Spark等第三方依赖打包进去,运行时JVM无法找到Spark相关的类。
解决方法
方法1:打包成包含所有依赖的fat jar(本地独立运行)
在pom.xml中添加maven-assembly-plugin插件配置,打包时会把所有依赖合并到同一个jar包里:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 可选:指定主类,之后可以直接用java -jar运行不用写主类路径 --> <archive> <manifest> <mainClass>com.mycompany.app.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
配置完成后重新执行mvn package,target目录下会生成后缀为jar-with-dependencies.jar的文件,运行命令改为:
java -cp target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar com.mycompany.app.App # 如果你配置了主类,也可以直接运行: # java -jar target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
方法2:提交到Spark集群运行(生产环境常用)
如果是在已经部署了Spark的环境运行,不需要把Spark依赖打进jar包,直接用Spark自带的提交命令运行即可:
spark-submit --class com.mycompany.app.App target/my-app-1.0-SNAPSHOT.jar
这种方式Spark会自动加载环境中自带的Spark依赖包,不需要自行打包。
额外注意事项
- Spark 3.2.0对应的Scala版本要和你依赖里的
_2.13匹配,如果你本地Spark环境用的是Scala 2.12,需要把依赖的artifactId改成spark-core_2.12,否则会出现版本不兼容的错误。 - 开发调试阶段如果是在VSCode里直接运行,可以不用打包,VSCode的Maven插件会自动把依赖加到类路径里,直接右键运行主类即可。
内容的提问来源于stack exchange,提问作者Santeau
相关产品推荐
相关产品推荐

