Parboiled 在 Java 21 下进行了预煮:不支持的类文件主要版本 65

3
我正在使用parboiled作为一个依赖项。
// https://mvnrepository.com/artifact/org.parboiled/parboiled-java
api 'org.parboiled:parboiled-java:1.4.1'

从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)

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

最小可复现示例:

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

你能提供一个最小可复现环境(MRE)吗?这看起来像是你的运行环境中可能仍然存在Java 17的痕迹;一个Dockerfile、Nix衍生物或其他自包含的复现器可以排除这种可能性。 - undefined
2
这对我来说似乎不是一个环境问题。Parboiled依赖于ASM字节码库。尝试将其升级到9.5版本以支持Java 21。然而,从异常中获取更多的堆栈帧可能会有所帮助。关于Gradle版本覆盖的信息,请参考:https://docs.gradle.org/current/userguide/dependency_constraints.html - undefined
1
强制使用ASM 9.5确实解决了问题!parboiled-java:1.4.1默认依赖于9.2版本。 - undefined
1个回答

4
这个问题出现在 Parboiled 的依赖库 ASM 上。Parboiled 1.4.1 使用的是 ASM 9.2 版本,但是 Java 21 的支持是在 ASM 9.5 版本中添加的。
添加以下内容将强制 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'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接