この記事 で主張されているように、Java9にはECMAScript6のサポートが含まれるようになりました。ただし、Java with ScriptEngine で実行する方法については説明していません。リンクされたJavaマガジンでも説明していません。記事には次のように書かれています。
ES6サポートをアクティブにするには、コマンドラインで
--language=es6
を使用します。
これはjjs
で機能しますが、Javaコードからこれを有効にする方法が見つかりません。テストするために、次のコードを使用しました。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
...
ScriptEngine engine = new ScriptEngineManager().getEngineByMimeType("application/javascript");
try {
engine.eval("const a = 20;");
} catch (ScriptException e) {
e.printStackTrace();
}
次の例外で失敗します。
javax.script.ScriptException: <eval>:1:0 Expected an operand but found const
const a = 20;
^ in <eval> at line number 1 at column number 0
[STACK TRACE OMITTED]
私はこのコードで利用可能なすべての ScriptEngineFactories をリストしようとしました:
import Java.util.List;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
...
List<ScriptEngineFactory> factories = new ScriptEngineManager().getEngineFactories();
for (ScriptEngineFactory factory : factories) {
System.out.println("-----------------------");
System.out.println(factory.getLanguageName());
System.out.println(factory.getLanguageVersion());
}
これにより、次のように出力されます。
-----------------------
ECMAScript
ECMA - 262 Edition 5.1
これは、ECMAScript6をJavaで、jjs
のみを使用して実行できないことを意味しますか?それとも、見逃したことがありますか?
よろしくお願いします。
ここでNashornの質問を閲覧しているときに、私は この質問 に出くわしました。その回答は、Nashornエンジンのコマンドライン引数を渡す方法を2つ説明しています。 この回答 は NashornScriptEngineFactory を直接使用することを提案し、次のコードを使用します。
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
...
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine("--language=es6");
try {
engine.eval("const a = 20;\n"
+ "print(a);");
} catch (ScriptException e) {
e.printStackTrace();
}
これは機能しますが、公式にサポートされているパッケージではないjdk
パッケージを使用するため、優れたソリューションではありません。 別の回答 は、システムプロパティnashorn.args
で引数を設定できることを示しています。コード:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
...
System.setProperty("nashorn.args", "--language=es6");
ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
try {
engine.eval("const a = 20;\n"
+ "print(a);");
} catch (ScriptException e) {
e.printStackTrace();
}
これは、以下に依存しているため、これを行うための優れた方法でもありません。
language
コマンドラインパラメーターをサポートするために最新です。私は個人的に、最初のバージョンを好みます。なぜなら、NashornScriptEngineFactoryがそこに存在しないため、Java 1.8に ClassNotFoundException がスローされるのに対し、2番目のバージョンは黙って無視するからです。プロパティの設定。