Java 21 下的 Parboiled:不支持的类文件主要版本 65

Yau*_*aun 6 java parboiled java-21

我使用 parboiled 作为依赖项:

// https://mvnrepository.com/artifact/org.parboiled/parboiled-java
api 'org.parboiled:parboiled-java:1.4.1'
Run Code Online (Sandbox Code Playgroud)

从 java 17 更新到 21 后,我在尝试创建解析器时在运行时收到此错误:

java.lang.RuntimeException: Error creating extended parser class: Unsupported class file major version 65
        at org.parboiled.Parboiled.createParser(Parboiled.java:58)
Run Code Online (Sandbox Code Playgroud)

版本 65 的类文件是 Java 21。解析器类现在确实使用目标 21 进行编译。为什么 parboiled 不能使用它?除了降级到目标 17 之外还有其他解决方法吗?

最小可重现示例:

构建.gradle

plugins {
    id "application"
}
apply plugin : "java" 

ext {
   javaMainClass = "test.TestParser"
}

application {
    mainClassName = javaMainClass
}
dependencies {
    
    implementation 'org.parboiled:parboiled-java:1.4.1'
}
Run Code Online (Sandbox Code Playgroud)

测试解析器.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);
    }

}

Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

Yau*_*aun 6

此故障发生在ASM库中,Parboiled 具有该库的依赖项。Parboiled 1.4.1 使用 ASM 9.2,但 ASM 9.5 中添加了 Java 21 支持。

添加以下内容将强制 gradle 将所有 ASM 依赖项解析为版本 9.5,从而解决该问题:

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'
}
Run Code Online (Sandbox Code Playgroud)