Java Drools API中的NullPointerException
运行Java程序时出现空指针异常。Java Drools API中的NullPointerException,java,nullpointerexception,drools,Java,Nullpointerexception,Drools,运行Java程序时出现空指针异常。 addPackageFromDrl工作不正常,因此从builder.getPackage()返回的pkg为空 我在用口水 private static RuleBase readRules() throws DroolsParserException, IOException { Reader source = new InputStreamReader( MessageDroolsTest1.class.getClassLoader()
addPackageFromDrl
工作不正常,因此从builder.getPackage()
返回的pkg为空
我在用口水
private static RuleBase readRules() throws DroolsParserException, IOException {
Reader source = new InputStreamReader(
MessageDroolsTest1.class.getClassLoader().getResourceAsStream( "rule.drl" ) );
System.out.println("Source:" + source);
PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( source );
System.out.println("Builder:" + builder);
Package pkg = builder.getPackage();
System.out.println("Package:" + pkg);
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
return ruleBase;
}
我尝试了另一种方法,但仍然遇到运行时异常
private static KnowledgeBase createKnowledgeBase() {
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
//Add drl file into builder
File drl = new File("rules.drl");
builder.add(ResourceFactory.newFileResource(drl), ResourceType.DRL);
if (builder.hasErrors()) {
throw new RuntimeException(builder.getErrors().toString());
}
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
//Add to Knowledge Base packages from the builder which are actually the rules from the drl file.
knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
return knowledgeBase;
}
错误
Exception in thread "main" org.drools.RuntimeDroolsException:
Unable to load dialect 'org.drools.rule.builder.dialect.java.JavaDialectConfiguration:
java:org.drools.rule.builder.dialect.java.JavaDialectConfiguration'
这对我来说是可行的,至少有一个正确的DRL文件 我建议你加上
System.out.println("Builder:" + builder);
if( builder.hasErrors() ){
System.out.println("Builder has errors!");
}
如果这表明存在错误,请使用其他方法检索消息
Drools 6引入了一整套新类(Knowledge*),您应该使用它们。不建议使用内部API(或Drools 5中使用的API),您的代码可能会因任何版本更改而中断
**后来**
6.x的简单构建过程:
public void build() throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
FileInputStream fis = new FileInputStream( "simple.drl" );
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newInputStreamResource( fis ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
System.out.println( results.getMessages() );
throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieContainer.newKieSession();
}
我也尝试了
KnowledgeBuilder
方法。我有个例外。更新了我的问题。您没有使用建议的6.x构建序列,请参阅我的添加。-检查org/drools/compiler/rule/builder/dialent/java/javadialenconfiguration.class是否位于类路径上的drools-compiler-6.0.0.Final.jar中。检查类路径上是否没有混合使用5.x和6-x jar-@laune I安装了drools 6 jar,上述错误消失。我现在得到这个错误<代码>java.lang.IllegalArgumentException:无法为类“org.drools.builder.KnowledgeBuilderFactoryService”实例化服务我在drools 6.0中没有看到drools api jar,因此从另一个项目复制。drools api jar在drools 6中不是可用的吗?如果没有,我应该为KnowledgeBuilder包含哪个jar?它在kie-internal-6.x.x.Final.jar中。将分发版中的所有JAR放入1目录-在大多数情况下,类路径定义足够:tag=6.0.0.Final;export CLASSPATH=“.:$root/drools-core-${tag}.jar:$root/kie-api-${tag}.jar:$root/kie-internal-${tag}.jar:$root/knowledge-internal-api-${tag}.jar:$root/drools-compiler-${tag}.jar:$root/antlr-runtime-3.5.jar:$root/ecj-3.7.2.7.Final.jar:$root/mvel2-2.1.1.8.3/quartz-1.8.3.3.3.jar:$root/drools-decisionjar:$quartz-tag.jar:$root/drools templates-${tag}.jar:$root/protobuf-java-2.5.0.jar:$root/slf4j-api-1.7.2.jar:$root/xstream-1.4.3.jar:$slf4j“@laune I添加了kie内部导入,eclipse说KnowledgeBase
不推荐使用。。我不能使用KnowledgeBase api吗?谢谢@laune,我做了两件事。。