Junit 测试不适用于 Drools 5.4.0.Final 和 JDK 8

2022-09-01 21:27:42

我最近开始将我的应用程序JDK版本从jdk1.7.0_121_x64升级到jdk1.8.0_202_x64。我有一些使用Drools 5.4.0.Final的遗留代码。此代码适用于 JDK 版本jdk1.7.0_121_x64,没有任何问题。

Maven 依赖关系包括:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>5.4.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>5.4.0.Final</version>
</dependency>

DRL 文件加载如下:

final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(resource, ResourceType.DRL);
knowledgeBase.addKnowledgePackages(kbuilder.getKnowledgePackages());

我意识到在JDK 8中使用Drools存在问题。我首先参考了其他SO线程


当我使用 JDK 8 构建应用程序并执行 Junit 测试时,测试失败并出现错误:

testRunRule(com.company.app.RuleTest)  Time elapsed: 0.073 sec  <<< ERROR!
java.lang.RuntimeException: java.lang.RuntimeException: wrong class format
    at org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:372)
    at org.drools.commons.jci.compilers.EclipseJavaCompiler$2.createNameEnvironmentAnswer(EclipseJavaCompiler.java:287)
    at org.drools.commons.jci.compilers.EclipseJavaCompiler$2.findType(EclipseJavaCompiler.java:258)

SO线程中提到的,我发现了对这个错误修复票证DRIOLS-329的引用。


基于此错误修复票证中提到的方法,我尝试使用JANINO编译器:

添加了以下 maven 依赖项:

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.5.16</version>
</dependency>

我添加了以下 VM 参数(我正在从 eclipse 运行测试,因此在 JRE VM 参数中的 eclipse 启动配置中添加了该参数):

-Ddrools.dialect.java.compiler=JANINO

我仍然可以看到错误的类格式错误。所以我修改了我的代码以加载DRL文件::

final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
final Properties props = new Properties();
props.setProperty("drools.dialect.java.compiler", "JANINO");
final KnowledgeBuilderConfiguration config = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props, null);
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(config);
kbuilder.add(resource, ResourceType.DRL);
knowledgeBase.addKnowledgePackages(kbuilder.getKnowledgePackages());

这无济于事。我仍然可以看到错误的类格式错误。


我关注了这个外部链接中提到的另一个apprroach。我更新了添加/更新的 maven 依赖项,如下所示:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>5.4.0.Final</version>
    <exclusions>
      <exclusion>
          <groupId>org.mvel</groupId>
          <artifactId>mvel2</artifactId>
      </exclusion>
   </exclusions>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>5.4.0.Final</version>
    <exclusions>
      <exclusion>
          <groupId>org.eclipse.jdt.core.compiler</groupId>
          <artifactId>ecj</artifactId>
      </exclusion>
      <exclusion>
          <groupId>org.mvel</groupId>
          <artifactId>mvel2</artifactId>
      </exclusion>
   </exclusions>
</dependency>
<dependency>
    <groupId>org.mvel</groupId>
    <artifactId>mvel2</artifactId>
    <version>2.1.9.Final</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jdt.core.compiler</groupId>
   <artifactId>ecj</artifactId>
   <version>4.6.1</version>
</dependency>

mvel2补丁是使用:https://github.com/mkornipati/mvel/tree/2.1.9.Final.Patch

有了这个错误的类格式错误就消失了。但是我的测试现在失败了,并出现以下错误:

testRunRule(com.company.app.RuleTest))  Time elapsed: 4.684 sec  <<< ERROR!
java.lang.RuntimeException: org.drools.rule.InvalidRulePackage: Rule Compilation error : [Rule name='ruleCheck']
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (2:80) : Only a type can be imported. java.util.Map resolves to a package
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (2:101) : Only a type can be imported. java.util.HashMap resolves to a package
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (6:299) : org.drools.spi.KnowledgeHelper cannot be resolved to a type
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (6:339) : org.drools.template.parser.Row cannot be resolved to a type
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (6:373) : org.drools.FactHandle cannot be resolved to a type
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (6:411) : org.drools.template.parser.DefaultGenerator cannot be resolved to a type
    org/drools/template/parser/Rule_ruleCheck_8eb4621227714a36b7b84c8b764527e4.java (6:487) : org.drools.runtime.rule.RuleContext cannot be resolved to a type
    at org.drools.rule.Package.checkValidity(Package.java:445)

我不知道如何继续前进。如果您能够使Drools 5.4与JDK 8一起使用,请告诉我。


答案 1

我将 Drools 7.7.0 与 Java 8 结合使用,对我来说效果很好。我不确定与Java 8兼容的最古老的Drools版本是什么。也就是说,Drools 5.4.0于2011年发布。Java 8于2014年发布,因此您可以假设它不会兼容。Java 7 于 2011 年 7 月发布。根据5.4.0的发布时间,它可能是也可能不是。基于此,我希望Draols 5.4.0与Java 6或更早版本兼容。如果你想在Draols中使用Java 8,我不明白如何在不升级的情况下做到这一点。我认为最早的兼容版本是6.1.0 download.jboss.org/drools/release

总而言之:将项目降级到 Java 6 以使用 Drools 5.4.0,或者 Upgrade Drools 以使用 6.1.0。更好的是,升级到最新的Drools,然后弄清楚它支持的最新Java版本是什么。


答案 2

推荐