29

さまざまな機能のスクリプト作成に Javascript を多用する Java 7 プロジェクトがあります。今まではRhinoをスクリプトエンジンとして使っていました。Java 8 に移行したいと考えています。これは、Rhino を Nashorn に置き換えることも意味します。

Nashorn は Rhino とどの程度互換性がありますか? 一時的な代替品として使用できますか? それとも、スクリプトの一部が機能しなくなり、新しいエンジンに移植する必要があると予想できますか? Nashorn でサポートされていない、よく使用される Rhino の機能はありますか?

4

7 に答える 7

28

1 つの問題は、Nashorn がデフォルトで Java パッケージ全体をグローバル スコープにインポートできなくなったことです。importPackage(com.organization.project.package);

ただし、簡単な回避策があります。次の行をスクリプトに追加することで、Rhino の古い動作を有効にすることができます。

load("nashorn:mozilla_compat.js");

私が遭遇したもう 1 つの問題は、Java と JavaScript の間でデータを渡すときの特定の型変換の動作が異なることです。たとえば、Javascript 配列を Java に渡すと到着するオブジェクトは、 にキャストできなくなりますがList、 にキャストできますMap<String, Object>。回避策として、Javascript コードで Javascript 配列を Java List に変換するには、次を使用します。Java.to(array, Java.type("java.util.List"))

于 2014-03-19T20:33:19.517 に答える
10

JDK 8 でimportClassメソッドを使用するには、次のコマンドを追加する必要があります。

load("nashorn:mozilla_compat.js");

ただし、この変更は JDK 7 での実行に影響します (JDK は load メソッドをサポートしていません)。

両方の SDK の互換性を維持するために、try/catch 句を追加してこの問題を解決しました。

try{
    load("nashorn:mozilla_compat.js");
}catch(e){
}
于 2015-08-12T20:44:19.600 に答える
3

Nashorn はインスタンスで静的メソッドを呼び出すことができません! Rhino がこれを行ったので、Rhino を Java 8 にバックポートする必要がありました (ここに短い要約があります: http://andreas.haufler.info/2015/04/using-rhino-with-java-8.html )

于 2015-04-21T07:19:32.813 に答える
-1

Nashorn ではなく Rhino にある機能の 1 つは、インスタンスを介して静的メンバーを公開することです。

http://nashorn-dev.openjdk.java.narkive.com/n0jtdHc9/bug-report-can-t-call-static-methods-on-a-java-class-instanceから: "

私の信念は、インスタンスを介して静的メンバーを公開することは、別々の名前空間をずさんにマッシュアップすることであるということです。したがって、それを有効にしないことにしました。

これは深く間違っていると思います。2 つの異なる構造体を使用して同じ Java オブジェクトにアクセスし、javascript でパッケージ宣言を不必要に使用する必要がある限り、認知負荷が増加するため、コードの読み書きが難しくなります。その場合、私はRhinoに固執します。

この明らかな「設計上のバグ」の回避策はまだ見つかっていません。

于 2016-02-04T15:44:42.250 に答える