2

正如我之前提出的另一个问题所述,我正在尝试为 Nashorn 找到一种解决方法,使其与 1.8 以上的每个 Java 版本兼容。
我目前正在尝试UnsupportedClassVersionError了解系统是否能够像这样运行独立的 Nashorn for Java 15(Kotlin 代码):

scriptEngine = try {
            
    // Java >= 15

    org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory().scriptEngine
} catch(e: UnsupportedClassVersionError) {

    // Java < 15

    @Suppress("DEPRECATION")
    jdk.nashorn.api.scripting.NashornScriptEngineFactory().scriptEngine
}

但是,看起来错误没有被捕获。堆栈跟踪如下:

java.lang.UnsupportedClassVersionError: org/openjdk/nashorn/api/linker/NashornLinkerExporter has been compiled by a more recent version of the Java Runtime (class file version 59.0), this version of the Java Runtime only recognizes class file versions up to 55.0

我还尝试捕获NoClassDefFoundError反转以前的 try/catch(加载 Java < 15 Nashorn,如果它不存在,则加载独立的),但错误是相同的。

编辑:看起来错误是由 Java < 15 Nashorn 本身引发的。

4

3 回答 3

5

Nashorn 维护者在这里!我刚刚发布了Nashorn 15.2,它与 15.1.1 相同,但现在使用 Java 11 编译。这意味着您现在可以将独立的 Nashorn 与 Java 11 及更高版本一起使用,而不必切换为 < 15 和 >= 15。我写了一个页面来解释如何在存在内置和独立 Nashorn 的 Java 11-14 上使用它。

于 2021-02-13T21:16:41.733 回答
2

像这样的东西怎么样(对不起,我不是 Kotlin 开发人员,所以纯 Java):

public static ScriptEngine getJSScriptEngine() {
    if (Double.parseDouble(System.getProperty("java.specification.version")) < 15) {
        return new ScriptEngineManager().getEngineByName("js");
    } else {
        return new org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory()
            .getScriptEngine();
    }
}
于 2021-02-05T11:13:43.830 回答
1

错误是由 JVM 本身引发的。它是从块内部抛出的catch,因为在旧 Nashorn 的类加载过程中,由于某种原因(名称冲突?)最终会NashornLinkerExporter从 Nashorn 的独立版本中加载一个类(),这似乎也存在于类路径中,因为它是使用 jvmTarget=15 编译,它不能在早期的 JVM 中加载。

对于 JVM<15,您需要从包中排除这个库(通过构建工具创建单独的工件),或者至少从运行时类路径中排除。在这种情况下NoClassDefFoundError将从内部try块抛出,并且不会从内部catch块抛出错误。

于 2021-02-06T08:00:44.667 回答