在Java 11中使用枚举时,出现UnsupportedOperationException异常,在Java 8中工作正常

问题描述

我正在将现有的应用程序Java 7移植到Java 11(Drools 7.42.0)。如果我以Java 1.8编译并部署在Java 11容器(Weblogic 14)上,则该应用程序将按预期工作。但是,如果我在Java 11中编译相同的代码,则会收到以下错误。 1.8和11之间的唯一变化是Maven pom中的Java编译器级别。 我将ASM7作为Maven的依赖项。

Caused by: java.lang.UnsupportedOperationException: This feature requires ASM7
        at org.mvel2.asm.ClassVisitor.visitnestMember(ClassVisitor.java:236)
        at org.mvel2.asm.ClassReader.accept(ClassReader.java:651)
        at org.mvel2.asm.ClassReader.accept(ClassReader.java:391)
        at org.drools.core.util.asm.ClassFieldInspector.processClassWithByteCode(ClassFieldInspector.java:107)
        at org.drools.core.util.asm.ClassFieldInspector.processClassWithByteCode(ClassFieldInspector.java:114)
        at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:86)
        at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:74)
        at org.drools.core.base.ClassFieldAccessorFactory.getClassFieldInspector(ClassFieldAccessorFactory.java:157)
        at org.drools.core.base.ClassFieldAccessorFactory.getFieldType(ClassFieldAccessorFactory.java:141)
        at org.drools.core.base.ClassFieldAccessorStore.getFieldType(ClassFieldAccessorStore.java:295)
        at org.drools.compiler.rule.builder.PatternBuilder.getValueType(PatternBuilder.java:1079)
        at org.drools.compiler.rule.builder.PatternBuilder.normalizeExpression(PatternBuilder.java:1047)
        at org.drools.compiler.rule.builder.PatternBuilder.buildExpression(PatternBuilder.java:965)
        at org.drools.compiler.rule.builder.PatternBuilder.buildCcdDescr(PatternBuilder.java:942)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:767)
        at org.drools.compiler.rule.builder.PatternBuilder.processConstraintsAndBinds(PatternBuilder.java:620)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:187)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:154)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:136)
        at org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:66)
        at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:107)
        at org.drools.compiler.builder.impl.KNowledgeBuilderImpl.internalAddRule(KNowledgeBuilderImpl.java:1183)
        at org.drools.compiler.builder.impl.KNowledgeBuilderImpl.addRule(KNowledgeBuilderImpl.java:1178)
        at org.drools.compiler.builder.impl.KNowledgeBuilderImpl.lambda$null$3(KNowledgeBuilderImpl.java:1134)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
        at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
        at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
        at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)

我在调试时注意到这是由我们代码中的“枚举”引起的。如果删除枚举并使用常量,则Drools可以正常工作。该错误似乎表明任何嵌套类都可能发生这种情况。除了更改我们的代码删除嵌套的类和枚举之外,还有其他更好的方法解决此问题吗?

我看到在类org.drools.core.util.asm.ClassFieldInspector中,API设置为ASM5,但是MVEL期望使用ASM7。但是不确定为什么它不能在Java 8中运行,而不能在Java 11中运行。有什么建议吗?

ClassFieldVisitor(final Class< ? > cls,final boolean includeFinalMethods,final ClassFieldInspector inspector) {
    super(Opcodes.ASM5);
    this.clazz = cls;
    this.includeFinalMethods = includeFinalMethods;
    this.inspector = inspector;
}

解决方法

免责声明:我是Drools开发人员之一

这很有趣,因为我们可能不会发出有效的ASM代码。 请在https://issues.redhat.com上提交错误,以便我们对其进行修复

非常感谢您