問題タブ [nashorn]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2175 参照

java - Nashorn ScriptEngine はどのくらいのメモリを使用しますか?

現在、サーバー側のスクリプト機能を製品の 1 つに追加する作業を進めています。その一環として、JSR 223 スクリプト エンジンを評価しています。サーバー上で多数のスクリプトを実行する可能性があるため、これらのスクリプト エンジンのメモリ使用量が特に心配です。Rhino (Apple JDK 1.6.0_65-b14-462-11M4609、Mac OS X 10.9.2) と Nashorn (Oracle JDK 1.8.0-b132) を比較すると、ScriptEngine インスタンスごとのメモリ使用量に劇的な違いがあるようです。

これをテストするために、10 個の空の ScriptEngine インスタンスを起動し、stdin からの読み取りをブロックする単純なプログラムを使用します。次に、jmap を使用してヒープ ダンプを取得し (jmap -dump:format=b,file=heap.bin )、ダンプ内の関連するスクリプト エンジン インスタンスを検索します。

コンテキスト内のさまざまなリーダー/ライター フィールドを無効にする理由は、それらを使用しないためです。Rhino の以前のヒープ ダンプは、それらがインスタンスごとのオーバーヘッドのかなりの部分を構成していることを示唆しています (そして、共有されているようには見えません)。 .

これらのヒープ ダンプを Eclipse MAT で分析すると、次のインスタンスごとの保持ヒープ サイズが得られます。

  • Rhino: 13,472 バイト/インスタンス (リーダー/ライター フィールドを null にしないと、最大 73,832 バイト/インスタンスになります)
  • Nashorn: 324,408 バイト/インスタンス

この 24 倍のサイズの Nashorn の増加は予想されますか? 実行速度は、実行するスクリプト (ほとんどが I/O バウンド) にとって大きな問題ではないため、Java 8+ で使用する独自の Rhino のコピーを出荷することを検討しています。

0 投票する
1 に答える
2425 参照

java - Nashorn から拡張 Java クラスを取得する

JavaScript (Nashorn) から拡張 Java クラスを取得して使用する方法はありますか?

私がやろうとしているのは、Nashorn で Java クラスを拡張し、それを Java に戻すことです。たとえば、JS で別のクラスを拡張するクラスを定義します。

次に、この拡張オブジェクトを Java で次のように取得しようとしました。Object mySomeClass = scriptEngine.get("MySomeClass");

ただし、Java でこのオブジェクトに対してメソッド呼び出しを行うことができません。基本クラスにキャストしようとすると、常に例外がスローされます - com.test.SomeClass

Nashorn(JS)で作成した拡張クラスをJavaで利用することはできますか?

0 投票する
1 に答える
1446 参照

java - スクリプトの評価後に更新された変数を読み取る

Rhino で動作する JSR 223 (スクリプト) コードをテストして、Nashorn でどのように動作するかを確認しています。Bindings違いの 1 つの領域は、 への引数を介して渡された変数への更新の処理にありますengine.eval()。Rhino では、このメソッドを使用して、スクリプトを評価するときに動的変数バインディングを渡し、スクリプトの実行後にこれらの変数の更新された値を読み取ることもできます。ただし、Nashorn ではこれは機能しません。Bindings オブジェクト内のすべての変数の値は、スクリプトの実行後も初期値のままです。

TestNG テスト ケースで説明するには:

Rhino (Mac OS X 10.9.3 上の Apple JDK 1.6.0_65) を使用すると、テストに合格します。Nashorn (Oracle JDK 1.8.0_b132) では失敗します。後で変数を読み取るために、さまざまなアプローチを試しました- 、などを呼び出しますengine.get()engine.getBindings(ScriptContext.ENGINE_SCOPE).get()結果engine.getContext().getBindings(...).get()は常にnullです。

を呼び出して後で で読み取ると、動作させることができますが、バインディングを引数として渡すだけの場合と比べると、少し面倒です。engine.put("state", 1)engine.get("state")

JSR-223仕様を読んでも、この使用法をサポートする文言が見つからないので、エンジン固有ですか? Nashorn で私が望むことを達成する他の方法はありますか?

編集: 機能する 1 つのアプローチは、各変数を でラップし、Javascript でそれらのAtomicReference明示的なメソッドを呼び出すことです。.set(..)醜いですが、おそらく実行可能です。

0 投票する
1 に答える
2846 参照

java - jjs/Nashorn javascriptのCLASSPATHを指定する方法は?

励起可能なシェル スクリプトとして実行される Nashorn JavaScript にサード パーティ クラスをロードしたいと考えています。以下のスレッドを確認しましたが、ヒントがありませんでした。

Nashorn の JavaScript 内のクラス からメソッドにアクセスする方法 Nashorn の JavaScript 内のクラスからメソッドにアクセスする方法

ここに私のスクリプトがあります

実行中にこのエラーが発生します

スレッド「メイン」での例外 java.lang.RuntimeException: java.sql.SQLException: jdbc に適したドライバが見つかりません:sqlserver://1.2.3.4:1433;databaseName=email;user=email;password=email; jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:382) jdk.nashorn.tools.Shell.apply(Shell.java:381) jdk.nashorn.tools.Shell.runScripts(Shell.java) :310) jdk.nashorn.tools.Shell.run(Shell.java:166) で jdk.nashorn.tools.Shell.main(Shell.java:130) で jdk.nashorn.tools.Shell.main(Shell. java:109) 原因: java.sql.SQLException: jdbc に適したドライバーが見つかりません:sqlserver://12.3.4:1433;databaseName=email;user=email;password=email; java.sql.DriverManager.getConnection(DriverManager.java:689) で java.sql.DriverManager.getConnection(DriverManager.

0 投票する
1 に答える
2113 参照

java - Javaオブジェクトが特定のJavaタイプであるかどうかを比較するJava nashorn

instanceof を使用していますが、現在、期待どおりに機能していません。スクリプト内の Java コードから取得した変数があります。ご想像のとおり、この変数を MyObject クラスのインスタンスである myObject と呼びましょう。

これについては、ネット上で漠然とした情報しか見つかりませんでした。Javaで簡単に行うように、myObjectがMyObjectクラスのインスタンスであるかどうかを確認する明確な方法は何ですか?

ありがとう!

0 投票する
5 に答える
4866 参照

java - Nashorn-engine から Java API を削除するには?

nashorn-engine から Java API を非表示または削除することはできますか? 「デフォルト」の ECMAScript 262 Edition 5.1 のみを表示または使用できるようにするには、特に公開されている関数/変数を使用しますか?

エンドユーザーがシステム全体をハッキングすることを心配せずに、独自の特定のロジックを作成できるようにしたいと考えています。もちろん、nashorn エンジンなどにいくつかのセキュリティ ホールがあるかもしれませんが、それは別のトピックです。

編集:申し訳ありませんが、Java アプリケーション内で nashorn を実行していることを忘れていたため、コマンドライン パラメーターは使用できません。

0 投票する
2 に答える
3731 参照

java - WildFly に Nashorn クラスが見つかりません

WildFly で実行されている Web アプリケーション内の nashorn から内部クラスにアクセスする必要があります。

次のコードは、私のマシンで正常に動作しています。

しかし、WildFly 内で実行すると、次のサーブレットが ClassNotFoundException をスローします。

サーバーログは次のとおりです: https://gist.github.com/csokol/b81633bdbfa09bb55e2b