我在eclipse中创建了一个spark maven java项目。
我已将所有drools二进制文件添加为外部jar。
在我的pom.xml中,我为drools定义了以下依赖项。
的pom.xml
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>7.7.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.7.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.7.0.Final</version>
</dependency>
在我的代码中,我使用了以下类:
KieServices ks = KieServices.Factory.get();
当我使用spark-submit
命令
spark-submit --class Transformation --master local "C:\Users\xyz\SparkWorkspace\Transformation\target\Transformation-0.0.1-SNAPSHOT.jar"
我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/kie/api/KieServices$Factory
at Transformation.main(Transformation.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:87
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:197)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:227)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:136)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.kie.api.KieServices$Factory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 11 more
我无法找到任何相同的理由,因为我添加了必需的libs和maven依赖项。
有人可以帮忙吗?我是否需要在火花环境中为drools设置任何东西?
修改
在.m2文件夹下我也可以看到这些maven依赖jar文件。
并使用反编译器我检查了KieServices接口中是否存在Factory静态内部类。
那为什么在运行时会出现这个错误?