2010-12-05 4 views
2

내 응용 프로그램에 Groovy 스크립트를 사용하려고합니다. 문제는 GroovyScriptEngine #이 이전 실행에서 컴파일되었지만 이후 변경되지 않았더라도 항상 스크립트를 컴파일한다는 것입니다. 구성에 컴파일 결과를 저장하기 위해 실제 출력 폴더를 설정하더라도.응용 프로그램에서 Groovy 스크립트를 사용하는 가장 좋은 방법

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 필자는 스크립트가 미리 컴파일 된 결과를 포함하고있는 폴더에 스크립트를 보낼 수 있으며 컴파일이 완료되지 않았다면 (물론 스크립트가 수정되지 않는 한)

답변

1

솔루션 (해킹) 내가 지난에서 사용이 scriptCache 변수 사용 XStream을을 스트리밍하고 다시 읽어 대상이 플래그가 무엇

0

GroovyScriptEngine의 CompilerConfiguration (GroovyScriptEngine. setConfig 참고)을 사용하여 동작합니다. CompilerConfiguration 옵션이 있습니다. setRecompileGroovySource을 사용하여 소스가 변경된 경우 소스를 다시로드하고 다시 컴파일할지 여부를 설정할 수 있습니다. 컴파일러 구성 here (282 페이지)에 대한 자세한 내용을 볼 수 있습니다.

+0

확실하지 그것을 설정했지만, 문제는 Groovy 스크립트 번호 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)을 덮어 써야합니다.


편집 : 버그는 그루비 1.7.6에 reportedfixed을하고있다. Grails lib 폴더에서 Groovy 1.7.6을 사용해보십시오.

+0

알아두면 좋지만 이것은 제 문제가 아닙니다. 내 문제는 'if (entry == null) true를 반환하는 조건입니다.' isSourceNewer의 시작 부분. 즉, 새로운 GroovyScriptEngine은 이전에 컴파일되었고 이후 변경되지 않았더라도 항상 스크립트를 컴파일합니다. – IttayD

관련 문제