2010-01-14 2 views
1

ArtefactHandler을 구현 중이며 Script (기존 형식 지원)에서 인공물을 만들려합니다. 모든 스크립트를 인공물로 만들고 싶지는 않지만 grails-app의 특정 하위 디렉토리에있는 스크립트는 grails-app/foo/입니다.Grails - artefact 클래스가 grails-app의 하위 디렉토리에 있는지 확인합니다.

나는 님의 isArtefactClass 메서드에서 인공물의 경로를 알아 내려고 노력하고 있습니다. 클래스 원본 소스 경로를 가져 오는 방법이 있습니까? 그렇지 않으면 grails-app/foo에 포함되어 있는지 확인하십시오.

답변

1

Grails는 클래스가 어디에 있는지 파일 시스템에서 실제로 신경 쓰지 않습니다. 그것은 단지 연기와 거울 일뿐입니다. 현재로서는 위치 기반 인공물에 대한 지원은 없지만 티켓을 가지고 있습니다. http://jira.codehaus.org/browse/GRAILS-2174

그 동안 가장 간단한 해결책은 스크립트에 특정 명명 규칙을 적용하거나 특정 유형의 마커 주석. 내가 주석을 찾고 있지만 스크립트 클래스를 introspect하는 방법을 잘 모르겠습니다.

+0

이것은 공식 답변입니다. 아래에 해킹이 있습니다. – noah

0

누가는 위의 공식적인 답변을 가지고 있지만, 여기에 내가 해낸 해킹 : 아마 많은 문제가

if (Script.class.isAssignableFrom(clazz) 
    && ((DefaultGrailsApplication) ApplicationHolder.getApplication()). 
     getResourceLoader().loadGroovySource(clazz.getName()). 
     getPath().contains("grails-app/foo")) { 
    return true; 
} 

은. 우선 DefaultGrailsApplication을 GrailsApplication의 구현으로 사용하므로 캡슐화를 위반합니다. 둘째, loadGroovySource은 내장 된 인공물 (taglibs와 같은)에 대해 null을 반환합니다. 따라서 플러그인과 바이너리 형식으로 배포 된 모든 요소에서 작동하지 않을 수 있습니다.

EDIT : 프로덕션 환경에서 작동하지 않는 것처럼 보입니다. 드로잉 보드로 돌아 가기 ...

관련 문제