Rhinoがjavax.script.ScriptEngine
API経由でRhinoを実行しているときにRhinoが"Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit"例外をスローする問題に取り掛かりました。受け入れられた解決策は、sun.org.mozilla.javascript.Context
のsetOptimizationLevel(-1)
を呼び出すように見えます。Java 6でRhinoScriptEngineの最適化レベルを設定することはできますか?
残念ながら、ContextFactory
によって作成されたContext
にアクセスできないようです。私はをContextFactory.getGlobal()
に追加しようとしましたが、それは作成後にContext
を変更しますが、リスナーが呼び出されることはありません。私はまた、RhinoScriptEngine source from Java 6を見て、ContextFactory
が最適化レベルの値を決定するために読み込むプロパティを設定できるかどうかを確認しました。私の知る限りrhino.opt.level
プロパティを使用して最適化レベルを設定することが可能となり、デフォルトとによって-1
に最適化レベルを設定しRhinoScriptEngine
、Javaの7に、言うことができるように
。 Java 7 versionのmakeContext()
メソッドとJava 6 versionのmakeContext()
メソッドを比較して、どういう意味かを確認してください。
私の知る限りでは、in this example of using Rhino to run the CoffeeScript compilerのようにRhinoを直接実行することをお勧めします。ご覧のとおり、コードはかなり複雑ですので、可能であればjavax.script.ScriptEngine
APIを使用してJava 6をサポートしていきたいと思います。他のオプションはありますか?
もう一つのオプションに設定することはできませんJDK6とそれを束ねるために除外されているcom.sun.scriptからすべてのコードをコピーすることです。 javascriptパッケージを新しいパッケージ(あるいは、パッケージプライベートメンバにアクセスするために名前を変更したクラスを持つものと同じもの)にコピーし、makeContext()の実装を変更して最適化レベルを設定します。 – bolinfest
私は同じ問題に遭遇しました。 JDK8の「Nashorn」はより高度なJSエンジンであり、Nashornは64Kの問題を解決することができます。 –