Drools program throwing java.lang.NoClassDefFoundError:org/drools/core/impl/KnowledgeBaseFactoryServiceImpl
Drools program throwing java.lang.NoClassDefFoundError:org/drools/core/impl/KnowledgeBaseFactoryServiceImpl
需要一些帮助运行从 eclipse 中创建一个简单的 POC。
我在 eclipse 中写了一个 java class 和一个规则 (.drl)(使用 drools distribution 7.6.0)。我正在为 运行 规则创建知识库的代码片段:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("rules/Sample Rule.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
代码没有任何错误。但是在 运行 时间,我看到了以下异常
Caused by: java.lang.ClassNotFoundException: org.drools.core.impl.KnowledgeBaseFactoryServiceImpl
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 14 more
我导入了知识-api-6.5.0.Final.jar。但是没看到
org.drools.core.impl.KnowledgeBaseFactoryServiceImpl
相反,我看到了
org.drools.impl.KnowledgeBaseFactoryServiceImpl
在罐子里。我错过了什么吗?
如果您使用的是 Drools 7.6.0,为什么要导入 Knowledge-api-6.5.0.Final.jar
?
即使您导入该 jar 的正确版本,它也只会包含 API 接口,而根本没有实现。您仍然需要在执行代码时提供 类 实现这些接口。
如果您使用 Maven,这些是您需要的依赖项:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
对于版本 7.7.0-SNAPSHOT,这些依赖项转换为以下 jar 文件:
kie-api-7.7.0-SNAPSHOT.jar
drools-compiler-7.7.0-SNAPSHOT.jar
drools-core-7.7.0-SNAPSHOT.jar
不使用依赖管理系统(如 Maven)的问题是您可能仍需要向类路径中添加一些额外的 jar。
希望对您有所帮助,
需要一些帮助运行从 eclipse 中创建一个简单的 POC。 我在 eclipse 中写了一个 java class 和一个规则 (.drl)(使用 drools distribution 7.6.0)。我正在为 运行 规则创建知识库的代码片段:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("rules/Sample Rule.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
代码没有任何错误。但是在 运行 时间,我看到了以下异常
Caused by: java.lang.ClassNotFoundException: org.drools.core.impl.KnowledgeBaseFactoryServiceImpl
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 14 more
我导入了知识-api-6.5.0.Final.jar。但是没看到
org.drools.core.impl.KnowledgeBaseFactoryServiceImpl
相反,我看到了
org.drools.impl.KnowledgeBaseFactoryServiceImpl
在罐子里。我错过了什么吗?
如果您使用的是 Drools 7.6.0,为什么要导入 Knowledge-api-6.5.0.Final.jar
?
即使您导入该 jar 的正确版本,它也只会包含 API 接口,而根本没有实现。您仍然需要在执行代码时提供 类 实现这些接口。
如果您使用 Maven,这些是您需要的依赖项:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
对于版本 7.7.0-SNAPSHOT,这些依赖项转换为以下 jar 文件:
kie-api-7.7.0-SNAPSHOT.jar
drools-compiler-7.7.0-SNAPSHOT.jar
drools-core-7.7.0-SNAPSHOT.jar
不使用依赖管理系统(如 Maven)的问题是您可能仍需要向类路径中添加一些额外的 jar。
希望对您有所帮助,