#java #nullpointerexception #drools
#java #исключение nullpointerexception #drools
Вопрос:
Я получаю исключение нулевого указателя при запуске программы Java.
addPackageFromDrl
не работает должным образом, и, следовательно, pkg, возвращаемый из builder.getPackage()
, равен нулю.
Я использую Drools 6
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'
Комментарии:
1. Вы не используете рекомендуемую последовательность сборки для 6.x, см. Мое дополнение. — Проверьте, что org/drools/compiler/rule/builder/dialect/java/JavaDialectConfiguration.class находится в вашем drools-compiler-6.0.0.Final.jar на пути к классу. Убедитесь, что у вас нет смеси 5-x и 6-x jar-файлов в пути к классу-
2. @laune Я установил банки drools 6, и вышеуказанная ошибка исчезла. Сейчас я получаю эту ошибку.
java.lang.IllegalArgumentException: Unable to instantiate service for Class 'org.drools.builder.KnowledgeBuilderFactoryService'
Я не видел drools-api jar в drools 6.0 и, следовательно, скопирован из другого проекта. Разве drools-api jar не доступен в drools 6? Если нет, какой jar я должен включить для KnowledgeBuilder?3. Это в kie-internal-6.x.x.Final.jar . Поместите все банки из дистрибутива в 1 каталог. -В большинстве случаев достаточно определения пути к классу: tag=6.0.0.Final; экспортировать ПУТЬ к КЛАССУ =».:$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.jar:$root/mvel2-2.1.7.Final.jar:/extra/quartz-1.8.3/quartz-1.8.3.jar:$root/drools-decisiontables-${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»
4. @laune Я добавил kie-внутренний импорт, и eclipse говорит
KnowledgeBase
, что он устарел.. Разве я не могу использовать API базы знаний?5. Спасибо @laune, я заставил его работать..
Ответ №1:
Это работает для меня, по крайней мере, с правильным файлом DRL.
Я предлагаю вам добавить
System.out.println("Builder:" builder);
if( builder.hasErrors() ){
System.out.println("Builder has errors!");
}
Если это показывает, что есть ошибки, используйте другие методы для извлечения сообщений.
Drools 6 представляет целый набор новых классов (знаний *), и вы должны это использовать. Использование внутреннего API (или того, что использовалось в Drools 5) не рекомендуется, и ваш код может сломаться при любом изменении версии.
** Позже **
Простая процедура сборки для 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();
}
Комментарии:
1. Я
KnowledgeBuilder
тоже пробовал. Я получаю исключение. Обновил мой вопрос.