iT邦幫忙

0

在LINUX下JAVA 解析JavaScript,使用getEngineByName return null

查詢到的方法主要是用ScriptEngine去跑

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.eval(jspath);

起初使用的Engine是Nashorn,由於JDK版本是15,以為是因為淘汰nashorn的關係才NULL
而後切換engine name也始終是null
google到的資訊也很少,最為相關的是這個issue
而作者的辦法是由getEngineByName("nshorn")改為

import jdk.nashorn.api.scripting.NashornScriptEngineFactory;

ScriptEngine nashorn = new NashornScriptEngineFactory().getScriptEngine();

那麼就如同我所講的,不知道是不是由於JDK15移除nashorn,這個package其實也沒辦法import
當然目前的最佳解似乎只能是降JDK版本然後用作者的方法(尚未嘗試)
儘管JDK15推出時間不長,還是想問問各位有沒有經驗,或是這樣的需求應該使用其他方法,感謝。

1 個回答

0
通靈亡
iT邦研究生 2 級 ‧ 2020-10-30 10:21:25

GraalVM 可以參考看看
https://golb.hplar.ch/2020/04/java-javascript-engine.html
https://www.graalvm.org/reference-manual/js/NashornMigrationGuide/#nashorn-compatibility-mode

The Nashorn engine has been deprecated in JDK 11 as part of JEP 335 and and has been removed from JDK15 as part of JEP 372.

GraalVM can step in as a replacement for JavaScript code previously executed on the Nashorn engine. GraalVM provides all the features for JavaScript previously provided by Nashorn. Many are available by default, some are behind flags, and others require minor modifications to your source code.

Chien iT邦新手 5 級 ‧ 2020-10-30 11:17:50 檢舉

首先感謝回覆
這邊回應一下您的內容
第一個連結其實我有看過了,而根據內文,變動方法主要只有getEngineByName的參數改為graal.js,這個部分我在get之後有確認一下,engine本身依舊是null

而第二個連結中也有提到
GraalVM JavaScript is shipped with support for ScriptEngine. It registers under several names, including “graal.js”, “JavaScript”, and “js”.
也因此我想這個部分我是有考量到的。

以上是我根據兩個連結的理解,不知道是否有哪邊不夠充分,若有漏掉的內容,希望可以提醒一下,感謝

不太確定是否因為環境是linux造成的問題

Chien iT邦新手 5 級 ‧ 2020-10-30 11:31:25 檢舉

LOL, 等等 我根本沒安裝graalvm XDD
我找時間再試試

我要發表回答

立即登入回答