2010-11-22 12 views
2

は、私は、スクリプト言語としてのGroovyを使用しています。私の顧客のために物事を簡単にするために、私はヘルパークラスと定数を定義するグローバルスコープを持っています。このグローバルスコープに一度セットアップする方法はありスコープ私のアプリで

context = setupGroovy(); 
runScript(context, "global.groovy"); // Can I avoid doing this step every time? 
runScript(context, "user.groovy"); 

とちょうど埋め込まれたスクリプトを教えて:

現在、私は、ユーザースクリプトが実行されるたびに(グローバルスコープを構築する)スクリプトを実行する必要があります通訳:「変数が見つからない場合はここを見てください」そうすれば、一度グローバルスクリプトを実行できます。

注:セキュリティがここでの問題ではなく、ユーザーがグローバルスコープを変更することはできませんことを確認する方法を知っていれば、それは追加のプラスです。臆面もなくgroovy.codehausから盗まれ

答えて

1

簡単な解決策は​​からコードを使用することです:のは、高価な部分だった

GroovyCodeSource gcs = AccessController.doPrivileged(new PrivilegedAction<GroovyCodeSource>() { 
     public GroovyCodeSource run() { 
      return new GroovyCodeSource(scriptCode, fileName, GroovyShell.DEFAULT_CODE_BASE); 
     } 
    }); 
    GroovyClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<GroovyClassLoader>() { 
     public GroovyClassLoader run() { 
      return new GroovyClassLoader(parentLoader, CompilerConfiguration.DEFAULT); 
     } 
    }); 
    Class<?> scriptClass = loader.parseClass(gcs, false); 

:あなたはそうのようなスクリプトをプリコンパイルすることができます。今度はInvokeHelperを使用してコンパイルされたコードを(グローバル変数を使用して)コンテキストにバインドして実行します。

Binding context = new javax.script.Binding(); 
Script script = InvokerHelper.createScript(scriptClass, context); 
script.run(); 
1

: 自分のサーバーにグルーヴィーなスクリプトを埋め込むし、それらを修正の上 を再読み込みしたい人のための

最も完全なソリューションを GroovyScriptEngineです。あなたは、URL またはディレクトリ名を指定でき、根のような CLASSPATHのセットで GroovyScriptEngineを初期化します。その後、 は、それらの 根内の任意のGroovyスクリプトを実行することができます。任意の依存スクリプトが 変更された場合、ツリー全体が再コンパイルされますと が再ロード ようGSEは、スクリプト間 の依存関係を追跡します。

さらに、 スクリプトを実行するたびに、 には というスクリプトがアクセスできるプロパティが含まれているBindingを渡すことができます。 スクリプトで設定された任意のプロパティは、スクリプトが実行された後に結合が で利用できるようになります。ここで 簡単な例です:

見つかり
/my/groovy/script/path/hello.groovy: 

output = "Hello, ${input}!" 
import groovy.lang.Binding; 
import groovy.util.GroovyScriptEngine; 

String[] roots = new String[] { "/my/groovy/script/path" }; 
GroovyScriptEngine gse = new GroovyScriptEngine(roots); 
Binding binding = new Binding(); 
binding.setVariable("input", "world"); 
gse.run("hello.groovy", binding); 
System.out.println(binding.getVariable("output")); 
This will print "Hello, world!". 

here

でしょうあなたのためにその仕事のようなもの?