Spark Maven项目运行spark-submit时KieServices$Factory类找不到错误求助
解决Spark Submit中Drools的
NoClassDefFoundError: org/kie/api/KieServices$Factory问题 这个错误本质上是Spark运行时的类路径没有包含Drools相关的依赖JAR——虽然你在Eclipse开发环境里配置好了依赖,但Spark Submit的运行环境和本地开发环境的类路径是完全分开的,下面我给你拆解原因和对应的解决方案:
核心原因
- 本地开发环境的依赖仅在Eclipse生效:你通过Maven添加的kie-api、drools-core等依赖,以及手动添加的外部Drools JAR,都只存在于本地项目或Maven
.m2目录中,但Spark Submit运行时(无论本地模式还是集群模式)并不会自动加载这些本地路径下的JAR。 - Spark的类路径隔离机制:Spark为了避免应用间依赖冲突,会使用独立的类加载器,默认仅加载自身核心JAR,不会主动读取本地Maven仓库或项目中的依赖。
可行的解决方案
方案一:打包成包含所有依赖的Fat Jar(推荐)
用Maven的Shade插件把项目代码和所有依赖(包括Drools相关JAR)打包成一个独立的Fat Jar,这样Spark Submit运行时就能直接加载所有需要的类。
在你的pom.xml里添加Shade插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 替换成你的主类全路径 --> <mainClass>com.yourpackage.YourSparkMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package,生成的Fat Jar会在target目录下,之后用这个JAR执行spark-submit命令:
spark-submit --class com.yourpackage.YourSparkMainClass target/your-fat-jar-name.jar
方案二:在spark-submit命令中指定依赖JAR
如果不想打包Fat Jar,可以用--jars参数把所有需要的Drools相关JAR都传给Spark Submit。注意要使用JAR的绝对路径;如果是集群环境,需要把这些JAR放到所有节点都能访问的路径(比如HDFS)。
示例命令:
spark-submit --class com.yourpackage.YourSparkMainClass \ --jars /path/to/kie-api-7.7.0.Final.jar,/path/to/drools-core-7.7.0.Final.jar,/path/to/drools-compiler-7.7.0.Final.jar,/path/to/your-external-drools.jar \ your-project-jar.jar
方案三:添加到Spark全局类路径(不推荐)
把Drools相关的所有JAR复制到Spark安装目录的lib文件夹下,然后重启Spark集群。这种方式会让所有Spark应用都能访问这些依赖,但会增加依赖冲突的风险,只适合固定依赖的场景。
额外注意点
- 确保依赖版本一致:你手动添加的外部Drools二进制文件,版本必须和pom.xml里的kie-api、drools-core、drools-compiler版本(7.7.0.Final)完全一致,避免版本不兼容导致的类加载问题。
- 本地模式也需要配置:即使你用Spark Submit本地模式运行,也需要通过上述方式配置依赖,因为Spark Submit的类路径和Eclipse的类路径是独立的。
内容的提问来源于stack exchange,提问作者Curious one
相关产品推荐
相关产品推荐

