Drools:编译规则(或加载编译规则)失败,在JamVM中出现模糊异常

Drools:编译规则(或加载编译规则)失败,在JamVM中出现模糊异常,drools,jamvm,Drools,Jamvm,我正在开发一个框架,作为其功能之一,它使机器人能够使用基于规则的系统。我们从Jess开始是RBS,现在想要实现drools(使用drools 5.2.0 final),它可以在运行OpenJDK 6的开发机器上运行 我们的robot控制器运行armlinux和JamVM,以前是1.4.3,但我最近编译了1.5.4,因为它缺少drools所需的类。失败后,我在虚拟机中使用与为控制器编译JAMV时相同的配置安装了JAMV,在那里它失败了,出现了相同的异常 一些研究表明,Drools+JamVM有bu

我正在开发一个框架,作为其功能之一,它使机器人能够使用基于规则的系统。我们从Jess开始是RBS,现在想要实现drools(使用drools 5.2.0 final),它可以在运行OpenJDK 6的开发机器上运行

我们的robot控制器运行armlinux和JamVM,以前是1.4.3,但我最近编译了1.5.4,因为它缺少drools所需的类。失败后,我在虚拟机中使用与为控制器编译JAMV时相同的配置安装了JAMV,在那里它失败了,出现了相同的异常

一些研究表明,Drools+JamVM有bug报告,但这也意味着它通常可以工作


使用预编译规则和以下代码运行框架时

kBase = KnowledgeBaseFactory.newKnowledgeBase();

ObjectInputStream in;
Collection<KnowledgePackage> kpkgs;
try {
    in = new ObjectInputStream(Thread.currentThread().getContextClassLoader().getResourceAsStream(
            packageFile));
    kpkgs = (Collection<KnowledgePackage>) in.readObject();
    in.close();
} catch(IOException e) {
    throw new DisboticsException("Couldn't read drools knowledge package file!", e);
} catch(ClassNotFoundException e) {
    throw new DisboticsException("Drools knowledge package file didn't contain expected instance.", e);
}

kBase.addKnowledgePackages(kpkgs);
kSession = kBase.newStatefulKnowledgeSession();
…在OpenJDK中工作。奇怪的是,
javadialtruntimedata
中有问题的列表是通过
Collections.emptyList()
获得的,并且再也不会被更改(或者eclipse建议……)


使用此代码运行裸
.drl
文件时:

Properties props = new Properties();
props.put("drools.dialect.java.compiler", "JANINO");

KnowledgeBuilderConfiguration kbConfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props,
        (ClassLoader[]) null);
KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbConfig);

kBuilder.add(ResourceFactory.newClassPathResource("disbotics/core/rules/drools/function.drl",
        DroolsRulesPlugin.class), ResourceType.DRL);
kBuilder.add(ResourceFactory.newClassPathResource(rulesFile, DroolsRulesPlugin.class), ResourceType.DRL);

if(kBuilder.hasErrors()) {
    String errorMessage = "";
    for(KnowledgeBuilderError error:kBuilder.getErrors())
        errorMessage = errorMessage + error.getMessage() + "\n";
    throw new DisboticsException(errorMessage);
}

kBase = KnowledgeBaseFactory.newKnowledgeBase();
kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());
kSession = kBase.newStatefulKnowledgeSession();
。。。我从规则编译器中获得以下(意外)异常:

Exception in thread "main" disbotics.core.common.DisboticsException: Line 2:8 unexpected exception at input '"mvel"'. Exception: java.lang.UnsupportedOperationException. Stack trace:
 java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.lang.descr.PackageDescr.addAttribute(PackageDescr.java:138)
   at org.drools.lang.api.impl.PackageDescrBuilderImpl.attribute(PackageDescrBuilderImpl.java:93)
   at org.drools.lang.ParserHelper.start(ParserHelper.java:684)
   at org.drools.lang.DRLParser.stringAttribute(DRLParser.java:1289)
   at org.drools.lang.DRLParser.attribute(DRLParser.java:1062)
   at org.drools.lang.DRLParser.statement(DRLParser.java:276)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:55)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

[ERR 107] Line 2:8 mismatched input '"mvel"' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
Line 4:0 unexpected exception at input 'global'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.globalStatement(DRLParser.java:401)
   at org.drools.lang.DRLParser.statement(DRLParser.java:261)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:55)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Parser returned a null Package
Line 2:8 unexpected exception at input '"java"'. Exception: java.lang.UnsupportedOperationException. Stack trace:
 java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.lang.descr.PackageDescr.addAttribute(PackageDescr.java:138)
   at org.drools.lang.api.impl.PackageDescrBuilderImpl.attribute(PackageDescrBuilderImpl.java:93)
   at org.drools.lang.ParserHelper.start(ParserHelper.java:684)
   at org.drools.lang.DRLParser.stringAttribute(DRLParser.java:1289)
   at org.drools.lang.DRLParser.attribute(DRLParser.java:1062)
   at org.drools.lang.DRLParser.statement(DRLParser.java:276)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

[ERR 107] Line 2:8 mismatched input '"java"' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
Line 4:0 unexpected exception at input 'import'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.importStatement(DRLParser.java:349)
   at org.drools.lang.DRLParser.statement(DRLParser.java:258)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Line 6:0 unexpected exception at input 'rule'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.rule(DRLParser.java:886)
   at org.drools.lang.DRLParser.statement(DRLParser.java:267)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Parser returned a null Package

   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:63)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)
同样,在OpenJDK中编译规则工作得很好。我们使用的是Janino,它在类路径上被正确引用(运行时使用的类路径由Maven构建创建,因此包含drools/Janino/anythis引用的所有JAR)



有人知道这里发生了什么和/或如何让Drools使用JAVM吗?

您是否使用OpenJDK 1.6编译知识包?然后尝试加载1.5.4?您应该尝试使用1.5.4编译原始包,看看是否有相同的错误

对于堆栈跟踪,看起来您正在尝试将某些内容添加到不可修改的列表中,对吗

基本上,这里有一个例外:kBase.addKnowledgePackages(kpkg);
是吗?

1)是的,是的-我还尝试在运行时编译规则,即使用JamVM,但这也给了我同样奇怪的错误。我也会尽快发布。。。2) 是的,是的——问题是(除非Drools在OpenJDK中不调用该代码),错误是针对JAMV的,尽管代码不建议用可修改的列表替换空列表(除非这里使用了一些高级反射),但JAMV似乎不支持不可修改的列表方法。不同的JVM实现可以忽略这类事情。我们应该多读一点关于JAVM为何抛出此异常的内容,并了解如何修复它:java.util.AbstractList.add(AbstractList.java:131)处的java.lang.UnsupportedOperationException感谢您的帮助!我希望您能找出JAVM上的列表有什么问题。在这么长的时间里,我们会尝试和Jess呆在一起,或者切换虚拟机,希望它能工作!如果您切换虚拟机但仍然存在问题,请告诉我,不支持的操作异常是虚拟机实现的一部分,因此我们应该尝试另一个。干杯
Exception in thread "main" disbotics.core.common.DisboticsException: Line 2:8 unexpected exception at input '"mvel"'. Exception: java.lang.UnsupportedOperationException. Stack trace:
 java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.lang.descr.PackageDescr.addAttribute(PackageDescr.java:138)
   at org.drools.lang.api.impl.PackageDescrBuilderImpl.attribute(PackageDescrBuilderImpl.java:93)
   at org.drools.lang.ParserHelper.start(ParserHelper.java:684)
   at org.drools.lang.DRLParser.stringAttribute(DRLParser.java:1289)
   at org.drools.lang.DRLParser.attribute(DRLParser.java:1062)
   at org.drools.lang.DRLParser.statement(DRLParser.java:276)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:55)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

[ERR 107] Line 2:8 mismatched input '"mvel"' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
Line 4:0 unexpected exception at input 'global'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.globalStatement(DRLParser.java:401)
   at org.drools.lang.DRLParser.statement(DRLParser.java:261)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:55)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Parser returned a null Package
Line 2:8 unexpected exception at input '"java"'. Exception: java.lang.UnsupportedOperationException. Stack trace:
 java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.lang.descr.PackageDescr.addAttribute(PackageDescr.java:138)
   at org.drools.lang.api.impl.PackageDescrBuilderImpl.attribute(PackageDescrBuilderImpl.java:93)
   at org.drools.lang.ParserHelper.start(ParserHelper.java:684)
   at org.drools.lang.DRLParser.stringAttribute(DRLParser.java:1289)
   at org.drools.lang.DRLParser.attribute(DRLParser.java:1062)
   at org.drools.lang.DRLParser.statement(DRLParser.java:276)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

[ERR 107] Line 2:8 mismatched input '"java"' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
Line 4:0 unexpected exception at input 'import'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.importStatement(DRLParser.java:349)
   at org.drools.lang.DRLParser.statement(DRLParser.java:258)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Line 6:0 unexpected exception at input 'rule'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.rule(DRLParser.java:886)
   at org.drools.lang.DRLParser.statement(DRLParser.java:267)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Parser returned a null Package

   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:63)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)