Reputation: 372
I'm am using parboiled as a dependency:
// https://mvnrepository.com/artifact/org.parboiled/parboiled-java
api 'org.parboiled:parboiled-java:1.4.1'
After updating from java 17 to 21 I am getting this error at runtime when trying to create a parser:
java.lang.RuntimeException: Error creating extended parser class: Unsupported class file major version 65
at org.parboiled.Parboiled.createParser(Parboiled.java:58)
Version 65 class files is Java 21. The parser class is now indeed compiled with target 21. Why would parboiled not work with it? Any other workarounds outside of downgrading to target 17?
Minimal reproducible example:
build.gradle
plugins {
id "application"
}
apply plugin : "java"
ext {
javaMainClass = "test.TestParser"
}
application {
mainClassName = javaMainClass
}
dependencies {
implementation 'org.parboiled:parboiled-java:1.4.1'
}
TestParser.java
package test;
import org.parboiled.BaseParser;
import org.parboiled.Parboiled;
import org.parboiled.Rule;
import org.parboiled.annotations.BuildParseTree;
@BuildParseTree
public class TestParser extends BaseParser<Object> {
public Rule InputLine() {
return Sequence(Digit(), EOI);
}
Rule Digit() {
return CharRange('0', '9');
}
public static void main(String[] args) {
TestParser parser = Parboiled.createParser(TestParser.class);
}
}
gradle run
Configuration on demand is an incubating feature.
> Task :test2:compileJava
> Task :test2:processResources NO-SOURCE
> Task :test2:classes
> Task :test2:run FAILED
Exception in thread "main" java.lang.RuntimeException: Error creating extended parser class: Unsupported class file major version 65
at org.parboiled.Parboiled.createParser(Parboiled.java:58)
at test.TestParser.main(TestParser.java:34)
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 65
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:199)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:180)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:166)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:287)
at org.parboiled.transform.AsmUtils.createClassReader(AsmUtils.java:59)
at org.parboiled.transform.ClassNodeInitializer.process(ClassNodeInitializer.java:62)
at org.parboiled.transform.ParserTransformer.extendParserClass(ParserTransformer.java:44)
at org.parboiled.transform.ParserTransformer.transformParser(ParserTransformer.java:39)
at org.parboiled.Parboiled.createParser(Parboiled.java:54)
... 1 more
Upvotes: 6
Views: 10356
Reputation: 892
I have a workaround, but I don't know why it works. I am using Gradle 8.5 and am specifying
org.gradle.java.home=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home
in my gradle.properties file. Whenever I introduce a new JAR (for example RDF4J), I get something like the following compilation error:
startup failed:
General error during conversion: Unsupported class file major version 65
java.lang.IllegalArgumentException: Unsupported class file major version 65
at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:199)
at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:180)
at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:166)
at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:287)
at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81)
at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251)
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125)
at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57)
at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44)
at org.codehaus.groovy.ast.decompiled.TypeSignatureParser.visitEnd(TypeSignatureParser.java:110)
...
If I:
I get no errors. The thing I don't understand is if I then:
Everything is fine.
Upvotes: 0
Reputation: 372
This failure is in the ASM library, which Parboiled has as a dependency. Parboiled 1.4.1 uses ASM 9.2, but Java 21 support was added in ASM 9.5.
Adding the following will force gradle to resolve all ASM dependencies to version 9.5 which resolves the problem:
configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'org.ow2.asm') {
details.useVersion "9.5"
}
}
}
dependencies {
implementation 'org.parboiled:parboiled-java:1.4.1'
}
Upvotes: 7