Junit 测试不适用于 Drools 5.4.0.Final 和 JDK 8
Posted
技术标签:
【中文标题】Junit 测试不适用于 Drools 5.4.0.Final 和 JDK 8【英文标题】:Junit tests not working with Drools 5.4.0.Final and JDK 8 【发布时间】:2020-04-27 13:26:19 【问题描述】:我最近开始将我的应用程序 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 thread 开始。
当我使用 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 thread 中提到的,我发现了对这个错误修复票DROOLS-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());
它没有帮助。我仍然可以看到错误的类格式错误。
我遵循了提到的另一种方法in this external link。我将添加/更新的 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 吗? @Boris:现在我正在尝试使用 5.6.0.Final 版本。从 6.x 开始,我知道 KnowledgeBase 已被弃用,我需要使用 KieBase。但这是一个旧代码,我们不想碰它。我了解到人们能够使用 JDK 8 运行 Drools 5.x(例如我的帖子中提到的 URL)。所以我们只是试图使现有版本与 JDK 8 一起工作。使用 JDK 1.7,代码运行没有任何问题。 @Boris:尝试使用 Drools 版本 5.6.0.Final。输出与 5.4.0.Final 版本相同。 @Boris:只有在确实有必要时,我才会这样做:1)我们没有关于此代码的任何文档。编写此代码的人不再与我们在一起。 2) 需要额外的努力来迁移/测试此代码。 Drools API 本身已更改。 3) 在一些参考资料中,人们可以通过 JDK 8 进行非常小的修改来运行 Drools 5.x(例如我的帖子中提到的 URL)。所以我真的会先尝试使用更简单的方法让它运行。 【参考方案1】:我使用了带有 Java 8 的 Drools 7.7.0,对我来说效果很好。我不确定与 Java 8 兼容的最旧的 Drools 版本是什么。也就是说,Drools 5.4.0 于 2011 年发布。Java 8 于 2014 年发布,因此您可以假设它不兼容。 Java 7 于 2011 年 7 月发布。取决于 5.4.0 的发布时间,它可能会也可能不会。基于此,我希望 Drools 5.4.0 与 Java 6 或更早版本兼容。如果您想将 Java 8 与 Drools 一起使用,我看不出不升级怎么办。我认为最早的兼容版本是6.1.0 download.jboss.org/drools/release。
总而言之:将您的项目降级到 Java 6 以使用 Drools 5.4.0 或升级 Drools 以使用 6.1.0。更好的是,升级到最新的 Drools,然后找出它支持的最新 Java 版本。
【讨论】:
以上是关于Junit 测试不适用于 Drools 5.4.0.Final 和 JDK 8的主要内容,如果未能解决你的问题,请参考以下文章
@IfProfileValue 不适用于 JUnit 5 SpringExtension
事务不适用于 Spring 3.1 – H2 – junit 4 – hibernate 3.2