web-dev-qa-db-ja.com

Java 9NashornエンジンからECMAScript6を実行できますか?

この記事 で主張されているように、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のみを使用して実行できないことを意味しますか?それとも、見逃したことがありますか?

よろしくお願いします。

11
TheZeus121

ここで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();
}

これは、以下に依存しているため、これを行うための優れた方法でもありません。

  • Nashornエンジンが存在しますが、他のJavaディストリビューション、および
  • Nashornエンジンは、languageコマンドラインパラメーターをサポートするために最新です。

私は個人的に、最初のバージョンを好みます。なぜなら、NashornScriptEngineFactoryがそこに存在しないため、Java 1.8に ClassNotFoundException がスローされるのに対し、2番目のバージョンは黙って無視するからです。プロパティの設定。

10
TheZeus121