Тесты Junit не работают с Drools 5.4.0.Final и JDK 8 - PullRequest
16 голосов
/ 10 января 2020

Я недавно начал обновлять версию 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());

I знал, что есть проблемы с использованием Drools с JDK 8. Я сослался на другой поток SO для начала.


Когда я создавал свое приложение и выполнял тесты Junit с использованием JDK 8, тесты не пройдены с ошибкой:

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, поэтому в конфигурации запуска eclipse в JRE VM аргумент добавил аргумент):

-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());

Это не помогло. Я все еще мог видеть неправильную ошибку формата класса.


Я следовал другому подходу, упомянутому в этой внешней ссылке . Я обновил добавленные / обновленные зависимости 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.

...