sirthias / parboiled

Elegant parsing in Java and Scala - lightweight, easy-to-use, powerful.
http://parboiled.org
Apache License 2.0
1.28k stars 156 forks source link

ClassFormatException when running 1.1.7 on Java8 #86

Open oxygenecore opened 9 years ago

oxygenecore commented 9 years ago

Exception while trying to instantiate parser using Parboiled.createParser() Java version: 1.8.0_25

Error creating extended parser class: Could not load class '<mypackage>.ElExpression$AnalyzerParser$$parboiled'
    at org.parboiled.Parboiled.createParser(Parboiled.java:58) ~[parboiled-java-1.1.7.jar:1.1.7]
    at <mypackage>.ElExpression$AnalyzerParser.<clinit>(ElExpression.java:109) ~[platform-blocks-impl-1.0-SNAPSHOT.jar:na]
    ... 123 common frames omitted
Caused by: java.lang.RuntimeException: Could not load class '<mypackage>.ElExpression$AnalyzerParser$$parboiled'
    at org.parboiled.transform.AsmUtils.loadClass(AsmUtils.java:247) ~[parboiled-java-1.1.7.jar:1.1.7]
    at org.parboiled.transform.ParserTransformer.defineExtendedParserClass(ParserTransformer.java:100) ~[parboiled-java-1.1.7.jar:1.1.7]
    at org.parboiled.transform.ParserTransformer.extendParserClass(ParserTransformer.java:47) ~[parboiled-java-1.1.7.jar:1.1.7]
    at org.parboiled.transform.ParserTransformer.transformParser(ParserTransformer.java:38) ~[parboiled-java-1.1.7.jar:1.1.7]
    at org.parboiled.Parboiled.createParser(Parboiled.java:54) ~[parboiled-java-1.1.7.jar:1.1.7]
    ... 124 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.GeneratedMethodAccessor261.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25]
    at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_25]
    at org.parboiled.transform.AsmUtils.loadClass(AsmUtils.java:242) ~[parboiled-java-1.1.7.jar:1.1.7]
    ... 128 common frames omitted
Caused by: java.lang.ClassFormatError: Class file version does not support constant tag 15 in class file <mypackagepath>/ElExpression$AnalyzerParser$$parboiled
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_25]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760) ~[na:1.8.0_25]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642) ~[na:1.8.0_25]
    ... 132 common frames omitted
oxygenecore commented 9 years ago

Parser class is defined as static inner class of another class, and it also uses sibling static inner classes.

oxygenecore commented 9 years ago

Ok, I've figured out that this error arises if I use new Action<X>(){ ... } in rule declarations.

alexec commented 8 years ago

+1, but seems to be a quite rare scenario?

wenerme commented 7 years ago

Just want to simplify the action, but got this error

 // helper function
 public static <V> Action<V> run(Consumer<Context<V>> func) {
        return v -> {
            func.accept(v);
            return true;
        };
    }

// use in rule
return Sequence(..., Parsers.run((c) -> node.setName(match())), ...);
bvkatwijk commented 6 years ago

+1 Any known fix/workaround ? I didn't use any Actions in my project. I have a slightly different error cause:

Caused by: java.lang.ClassFormatError: Class file version does not support constant tag 15 in class file [package]/Action$A3bkRxscB4Cqcexh
AngryCarrot789 commented 2 years ago

I think it's caused when lambdas are somehow used in an old java class version (e.g 1.6). If i replace list#forEach(lambda) with a for() loop, then it works fine