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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:06