javadroolsmvel

Java VerifyError when using Drools 6


I am seeing an exception after copying our app from Solaris to Linux.
Caused by: java.lang.VerifyError: (class: ASMAccessorImpl_17883800501688417666490, method: getKnownEgressType signature: ()Ljava/lang/Class;) Illegal type in constant pool

The application uses Java 8 in both environments but throws the exception when starting up on Linux.

Solaris:
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

Linux:
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Drools version 6.0.1.Final
mvel2-2.1.8.Final.jar

The rules are read from an xls file and contain over 400 rules so it would be impractical to post them here although the same rule sheet is used on both servers.

The stack trace

Caused by: java.lang.VerifyError: (class: ASMAccessorImpl_17883800501688417666490, method: getKnownEgressType signature: ()Ljava/lang/Class;) Illegal type in constant pool
       at java.lang.Class.getDeclaredConstructors0(Native Method)
       at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
       at java.lang.Class.getConstructor0(Class.java:3075)
       at java.lang.Class.newInstance(Class.java:412)
       at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer._initializeAccessor(ASMAccessorOptimizer.java:725)
       at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:859)
       at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.optimizeAccessor(ASMAccessorOptimizer.java:243)
       at org.mvel2.optimizers.dynamic.DynamicGetAccessor.optimize(DynamicGetAccessor.java:90)
       at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:64)
       at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
       at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42)
       at org.mvel2.MVEL.executeExpression(MVEL.java:930)
       at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:45)
       at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
       at org.mvel2.templates.res.CompiledForEachNode.eval(CompiledForEachNode.java:114)
       at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
       at org.mvel2.templates.res.TerminalNode.eval(TerminalNode.java:35)
       at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
       at org.mvel2.templates.res.CompiledIfNode.eval(CompiledIfNode.java:44)
       at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
       at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
       at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
       at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:285)
       at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:247)
       at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:255)
       at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:207)
       at org.drools.compiler.rule.builder.dialect.java.JavaRuleBuilderHelper.generateMethodTemplate(JavaRuleBuilderHelper.java:226)
       at org.drools.compiler.rule.builder.dialect.asm.AbstractASMConsequenceBuilder.build(AbstractASMConsequenceBuilder.java:24)
       at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:109)
       at org.drools.compiler.compiler.PackageBuilder.addRule(PackageBuilder.java:3369)
       at org.drools.compiler.compiler.PackageBuilder.compileRules(PackageBuilder.java:1093)
       at org.drools.compiler.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:972)
       at org.drools.compiler.compiler.PackageBuilder.addPackage(PackageBuilder.java:964)
       at org.drools.compiler.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:513)
       at org.drools.compiler.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:721)
       at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:51)
       at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:40)
       at org.drools.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:34)
       at com.itd.cantororderapp.RulesHelper.buildBaseFromDrl(RulesHelper.java:66)
       at com.itd.cantororderapp.RulesHelper.compileBaseFromXls(RulesHelper.java:52)
       at com.itd.cantororderapp.CantorFixMessageEnricher.<init>(CantorFixMessageEnricher.java:29)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
       at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)


Solution

  • I used the JVM -noverify option to disable this behavior, for the short term, in order to get the program running in production.