2010-11-22 16 views
2

Uygulamamda, Groovy'yi bir betik dili olarak kullanıyorum. Müşterilerim için işleri kolaylaştırmak için, yardımcı sınıfları ve sabitleri tanımladığım global bir kapsamım var. bu küresel kapsamı kez kurulum için bir yolu var mıGömülü groovy komut dosyalarının kapsamı

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

ve sadece gömülü komut söyleyin:

Şu anda, bir kullanıcı komut dosyası her yürütüldüğünde (küresel kapsamını oluşturur olan) komut dosyasını çalıştırmak için gereken tercüman: "Değişkeni bulamazsanız buraya bakın"? Böylece genel senaryoyu bir kez çalıştırabilirim.

Not: Güvenlik burada bir sorun değil ama kullanıcı genel kapsamını değiştiremez emin olmak için bir yol biliyorsanız, o ek bir artı.

cevap

1

basit bir çözüm groovy.lang.GroovyShell kod kullanmaktır: Çok gibi komut dosyası derleme edebilirsiniz: en pahalı parçası oldu

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); 

. Şimdi derlenmiş kodu bir bağlama (global değişkenlerle) bağlamak için InvokeHelper kullanın ve şu komutu çalıştırın:

1

utanmadan groovy.codehaus çalınan:

kendi sunucularında içine harika komut dosyalarını gömmek istiyorum ve onlara modifikasyonu üzerinde yeniden kişiler için en komple çözüm GroovyScriptEngine olduğunu. GroovyScriptEngine'i CLASSPATH benzeri kökler kümesiyle veya URL'leri veya dizin adları ile başlatabilirsiniz. Daha sonra , kökleri içindeki herhangi bir Groovy komut dosyasını yürütebilirsiniz. herhangi bağımlı komut değiştirilir eğer bütün ağaç çekirdekler ve yeniden böylece GSE da yazıları arasında bağımlılıkları takip edecektir.

Ayrıca, her zaman bir komut erişebilir özelliklerini içerdiğini Bağlama geçirebilirsiniz bir komut dosyasını çalıştırın. Komut dosyası çalıştırıldıktan sonra komut dosyasında belirtilen tüm özellikler bağında kullanılabilir. Bulunan

/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!". 

: sizin için işi gibi here

misiniz şey Burada basit bir örnek?

İlgili konular