如何解决Java < 15 和 >= 15 的不同 Nashorn 引擎?
我正在尝试为 Nashorn 找到一种解决方法,使其与 1.8 及以上的每个 Java 版本兼容,正如我之前问过的另一个 question 所述。
我目前正在尝试捕获 return File(..)
以了解系统是否能够像这样(Kotlin 代码)为 Java 15 运行 standalone Nashorn:
UnsupportedClassVersionError
但是看起来错误没有被捕获。堆栈跟踪如下:
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
反转之前的 try/catch(加载 Java
编辑:看起来错误是由 Java
解决方法
Nashorn 维护者在这里!我刚刚发布了 Nashorn 15.2,它与 15.1.1 相同,但现在使用 Java 11 编译。这意味着您现在可以在 Java 11 及更高版本中使用独立的 Nashorn,而不必切换为 = 15. 我写了一个 page to explain 如何在 Java 11-14 上使用它,其中有内置和独立的 Nashorn。
,这样的事情怎么样(抱歉,我不是 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();
}
}
,
错误是由 JVM 本身抛出的。它是从 catch
块内部抛出的,因为在旧 Nashorn 的类加载期间,它出于某种原因(名称冲突?)最终从独立版本的 Nashorn 加载了一个类(NashornLinkerExporter
),这似乎也存在于类路径中,因为它是用 jvmTarget=15 编译的,所以它不能在早期的 JVM 中加载。
对于 JVMNoClassDefFoundError 将从 try
块内部抛出,而 catch
块内部不会抛出任何错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。