2010-12-05 16 views
2

私のアプリケーションでGroovyスクリプトを使用しようとしています。問題はGroovyScriptEngine#が以前の実行でコンパイルされてから変更されていなくても、常にスクリプトをコンパイルするということです。設定でコンパイル結果を保存するために物理出力フォルダを設定したとしても。アプリケーションでGroovyスクリプトを使用する最良の方法

これを回避する最善の方法は何ですか?私にとって最適なのは、プリコンパイルされた結果を含み、コンパイルが行われていないフォルダをスクリプトに送ることができるということです(スクリプトが修正されていない限り)。

答えて

1

溶液(ハック)は

0

GroovyScriptEngineのCompilerConfiguration(GroovyScriptEngine。setConfigを参照)を使用した動作CompilerConfigurationオプションがあります。 setRecompileGroovySourceを使用して、ソースが変更された場合にソースを再ロードして再コンパイルするかどうかを設定できます。 CompilerConfiguration here(282ページ)の詳細を読むことができます。

+0

オブジェクトにXStreamのを使用してscriptCache変数をストリーミングすると戻ってそれを読んで、それを設定するには、このフラグは何をするかわからなかったが、問題はそのGroovyScriptEngine#ですisSourceNewerはScriptCacheEntryオブジェクトを使用します。その名前が示唆するように、それはキャッシュ(マップ)から来ます。 GroovyScriptEngineを作成すると、このマップは空です。エントリがないということは、isSourceNewerがtrueを返し、コンパイルをトリガすることを意味します – IttayD

2

Grails 1.3.5はGroovy 1.7.5を使用しています。 Groovyのバージョンでは、GroovyScriptEngine.run(..)は以下のメソッドを呼び出します:createScript(String, Binding) - >loadScriptByName(String) - >isSourceNewer(ScriptCacheEntry)

isSourceNewer(ScriptCacheEntry)は(残念ながら、私はウェブ上で一致するソースファイルを見つけられませんでした)のように定義されます。

(奇妙な)ロジックを実装
protected boolean isSourceNewer(ScriptCacheEntry entry) 
    throws ResourceException { 
    // ... 

    for (String scriptName : entry.dependencies) { 
     // ... 
     return true; // without any further condition! 
    } 

    return false; 
} 

スクリプトが依存関係を持っている場合」、それはより新しいですキャッシュされたスクリプト(そして再コンパイルする必要があります) "。それはコードがするはずのものではありません。変更時間で決定するはずです。

newer versions of GroovyScriptEngine, this has been corrected(ロジックが大幅に変更されました)が、現在はGroovyScriptEngineをサブクラス化し、ロジックを自分で修正するにはisSourceNewer(ScriptCacheEntry)を上書きする必要があります。


編集:バグがGroovyの1.7.6でreportedfixedてきました。 - Grails libフォルダのGroovy 1.7.6を試してみてください。私が最後に使用

+0

これは私の問題ではありません。私の問題は条件 'if(entry == null)trueを返します;' isSourceNewerの開始時に。つまり、新しいGroovyScriptEngineは、以前にコンパイルされてから変更されていなくても、常にスクリプトをコンパイルします。 – IttayD

関連する問題