针对Java的不同Nashorn引擎<;15和>;=15?
我正试图为Nashorn找到一个解决方案,使其与1.8以上版本的Java兼容,正如我在前面询问的另一个版本中所说的那样。针对Java的不同Nashorn引擎<;15和>;=15?,java,kotlin,nashorn,java-15,Java,Kotlin,Nashorn,Java 15,我正试图为Nashorn找到一个解决方案,使其与1.8以上版本的Java兼容,正如我在前面询问的另一个版本中所说的那样。 我目前正在尝试捕获不受支持的ClassVersionError,以确定系统是否能够像这样运行Java 15(Kotlin代码): scriptEngine=try{ //Java>=15 org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory().scriptEngine }捕获(e:UnsupportedCl
我目前正在尝试捕获
不受支持的ClassVersionError
,以确定系统是否能够像这样运行Java 15(Kotlin代码):
scriptEngine=try{
//Java>=15
org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory().scriptEngine
}捕获(e:UnsupportedClassVersionError){
//爪哇<15
@压制(“反对”)
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本身抛出的。这样怎么样(对不起,我不是Kotlin开发人员,所以是纯Java):
publicstaticscriptengine getJSScriptEngine(){
if(Double.parseDouble(System.getProperty(“java.specification.version”))<15){
返回新的ScriptEngineManager().getEngineByName(“js”);
}否则{
返回新的org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory()
.getScriptEngine();
}
}
像这样的东西怎么样(对不起,我不是Kotlin开发人员,所以纯Java):
publicstaticscriptengine getJSScriptEngine(){
if(Double.parseDouble(System.getProperty(“java.specification.version”))<15){
返回新的ScriptEngineManager().getEngineByName(“js”);
}否则{
返回新的org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory()
.getScriptEngine();
}
}
错误由JVM本身引发。它是从catch
块内部抛出的,因为在旧Nashorn的类加载过程中,出于某种原因(名称冲突?)它最终会从Nashorn的独立版本加载一个类(NashornLinkedRexporter
),该类似乎也出现在类路径中,并且由于它是使用jvmTarget=15编译的,它无法加载到早期的JVM中
对于JVM,错误由JVM本身抛出。它是从
catch
块内部抛出的,因为在旧Nashorn的类加载过程中,出于某种原因(名称冲突?)它最终会从Nashorn的独立版本加载一个类(NashornLinkedRexporter
),该类似乎也出现在类路径中,并且由于它是使用jvmTarget=15编译的,它无法加载到早期的JVM中
对于JVMNashorn维护人员,请点击此处!我刚刚发布了,它与15.1.1相同,但现在是用Java11编译的。这意味着您现在可以将独立Nashorn与Java 11及更高版本一起使用,而不必切换为<15和>=15。我写了一篇关于如何在Java11-14上使用它的文章,其中既有内置的也有独立的Nashorn!我刚刚发布了,它与15.1.1相同,但现在是用Java11编译的。这意味着您现在可以将独立Nashorn与Java 11及更高版本一起使用,而不必切换为<15和>=15。我写了一篇关于如何在Java11-14上使用它的文章,其中既有内置的,也有独立的Nashorn
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();
}
}