2013-03-13 2 views
3

Groovy 파일을 (현재) 가지고 있습니다.런타임에 Groovy 스크립트를 다른 Groovy 스크립트로 가져 오기

main.groovy

import org.packages.mystuff.JavaClassIAmUsing; 
public class MyObject { 

    def rate(item){ 
     def o = evaluate(new File (new File(getClass().protectionDomain.codeSource.location.path).parent),"CommonFunctions.groovy"); 
     println o.whoami(); 

    } 
} 

내가

CommonFunctions.groovy

def whoami() {return 'no body';} 

I가의 CommonFunctions 스크립트를 포함하기 위해 노력하고있어라는 또 다른 멋있는 파일이 주요 스크립트, 그러나 스크립트의 위치는 빌드 타임에 알려지지 않습니다 (즉, 스크립트에서 절대 파일 경로 또는 스크립트가 저장 될 위치와 관련하여 java 프로세스의 절대 경로를 하드 코딩하지 않습니다.

내가 아는 모두는 스크립트가 함께 또는 호출 스크립트 (하위 디렉토리)와 관련된 위치에 있다는 것입니다.

나는 시도하고 위치를 호출하는 스크립트의 위치를 ​​시도했지만, 나는 주요 스크립트를 고려,이 스크립트를 referance에 어떻게

No signature of method: MyObject.evaluate() 

GroovyClassLoader.parseClass를 사용하여 런타임에 액세스 할 때 오류를 얻을 (파일) 메소드.

답변

2

나는 왜 이런 식으로하고 싶은지 모르겠다. CommonsFunctions 클래스를 만드는 것이 훨씬 간단 할 것이라고 생각한다. 보통은 인스턴스화하고 어디에서나 사용할 수있다.

그러나 이며 원하는 것을 달성 할 수 있습니다.

  1. getClass() 당신의 MyObject 클래스 내부 그래서 당신을 ... 자연적으로 참조하는 MyObject 클래스 : 그루비와 함께, 귀하의 제안 솔루션 두 가지 문제가

    있습니다 ... 많은 제한이 없습니다 스크립트의 위치를 ​​찾으려고 시도하면 실패합니다. 올바른 방향으로 가고 있지만 주변 Script 클래스를 사용하여 스크립트 위치를 해결해야합니다.

  2. evaluate 실제로 생각대로 작동하지 않습니다. evaluate 메서드의 결과는 Script 클래스의 인스턴스가 아니라 스크립트의 결과입니다. 이 문제를 해결하는 한 가지 방법은 CommonFunction의 메소드를 클로저 특성으로 다시 작성하는 것입니다. 이 속성은 스크립트를 평가할 때 쉘 Binding 개체에서 사용할 수 있습니다.

    다음
    class MyObject { 
        def scriptDir 
    
        def rate(item) { 
         def commonFunctionsScriptFile = new File(scriptDir, "CommonFunctions.groovy") 
         def binding = new Binding() 
         new GroovyShell(binding).evaluate(commonFunctionsScriptFile) 
         println binding.variables.whoami() 
        } 
    } 
    
    scriptFile = new File(getClass().protectionDomain.codeSource.location.path) 
    new MyObject(scriptDir: scriptFile.parentFile).rate(null) 
    

    이 스크립트 파일의 위치는 스크립트에서 해결

    main.groovy,하지의 :

그래서, 이러한 재 작성으로,이 같은 끝낼 내부 클래스.

CommonFunctions.여기

whoami = { 'no body' } 

그루비, whoami는 더 이상 방법,하지만 바인딩에 추가됩니다 폐쇄 속성입니다. 에 접두사로 사용하지 말고 def으로 접두어로 붙이십시오. 바인딩 객체에 추가 된 속성 대신 로컬 변수가 될 것이기 때문입니다.

이러한 재 작성 후의 출력은 예상대로 : no body입니다.