2010-11-22 5 views
2

내 응용 프로그램에서는 Groovy를 스크립팅 언어로 사용합니다. 고객의 편의를 위해 헬퍼 클래스와 상수를 정의하는 전역 범위가 있습니다. 이 전역 한 번 설정에 대한 방법이 있나요내장 Groovy 스크립트 범위 지정

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

그냥 내장 된 스크립트를 말해 :

현재, 나는 사용자 스크립트가 실행될 때마다 (전역 범위를 구축하는) 스크립트를 실행해야합니다 통역관 : "변수를 찾을 수 없다면 여기를보십시오"? 그렇게하면 전역 스크립트를 한 번 실행할 수 있습니다.

참고 : 보안은 여기에 문제가되지 않지만 사용자가 전역 범위를 수정할 수 없도록하는 방법을 알고 있으면 추가 사항입니다.

답변

1

간단한 해결책은 groovy.lang.GroovyShell의 코드를 사용하는 것입니다 : 당신과 같이 스크립트를 미리 컴파일 할 수의가 비싼 부분이었다

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

은 뻔뻔 groovy.codehaus에서 도난 :

자신의 서버에 그루비 스크립트를 포함 할 그들을 수정에 를 다시로드있는 사람들 을위한 가장 완벽한 솔루션은 Groovy 스크립트 엔진을 이용하는 것입니다. GroovyScriptEngine을 또는 디렉토리 이름이 될 수있는 루트와 같은 CLASSPATH 집합으로 초기화합니다. 그런 다음 그루속 스크립트를 루 트내에서 실행할 수 있습니다. GSE는 종속성을 스크립트 사이에서 추적하므로 종속 스크립트가 수정되는 경우 전체 트리가 다시 컴파일되고 이 다시로드됩니다.

스크립트를 실행할 때마다에 스크립트에 액세스 할 수있는 속성이 포함 된 바인딩을 전달할 수 있습니다. 스크립트에 설정된 모든 속성은 스크립트가 실행 된 후 바인딩에서도 사용할 수 있습니다. 찾을 수

/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

겠습니까 뭔가 여기 은 간단한 예입니다?