2011-03-07 3 views
20

Grails 나 Play와 같은 프레임 워크가 코드의 변경을 감지하고 앱 서버를 재부팅하지 않고 자동으로 재 컴파일을 시작하는 방법에 대해 자세히 알고있는 사람이 있습니까? Groovy의 컴파일러 나 동적 인 특성에 특정한 것이 있습니까?Grails 또는 Play가 변경 사항 및 핫 리로드 클래스를 어떻게 감지합니까?

배경으로 빌드 프로세스 중에 비슷한 편집 및 새로 고침 기능을 사용할 수있는 사용자 지정 코드 생성 단계가 있습니다.

큰 그림을 얻기 위해 코드를 살펴 봐야 할지라도 사전에 모든 포인터를 보내 주셔서 감사합니다.

편집 : Grails 플러그인을 서블릿 컨테이너의 모든 앱에서 수행하는 데 필요한만큼 이해하지 못한다는 것을 분명히해야합니다. Grails가 아니라 Groovy를 사용하고 있습니다.

Edit2가 : 재생이 뜨거운 다시로드 할 수있는 특정 DEV 모드가 같은 그것은 소리 : 나는 JRebel이 클래스 로더를 통해 정교한 수준의 버전 관리를 수행하는 것을 이해 http://www.playframework.org/documentation/1.1.1/main#lifecycle

을,하지만 난 Grails의 또는 같은 것을 웹 프레임 워크를 믿고있어 놀이는 그 수준으로 나아 가지 않습니다.

+3

루크 데일리 (Luke Daley)는 Groovy 클래스에 대한 핫 리로드를 얻는 방법에 대한 멋진 기사를 가지고 있습니다. 그것은 당신을 위해 유용 할 수 있습니다 : http://ldaley.com/post/653190105/putting-the-artefact-api-to-work-in-your-grails-app – Dana

+0

여기 JRebel이 어떻게하는지에 대한 흥미로운 내용이 있습니다 일반적인 방법. Grails가 정교하지 않다고 가정합니다! http://www.zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/ – mckamey

+0

@ Codemwnci의 답을 해결책으로 표시하고 있지만, 누구든지 Grails에 대한 통찰력이 있다면 여전히 관심이 있습니다. 감사! – mckamey

답변

13

재생 Eclipse JDT를 사용하여 런타임에 코드를 컴파일합니다.

런타임에 필요한 컴파일을 수행하기 위해 Play에서 사용하는 다음 클래스를 살펴보십시오.

https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationCompiler.java

또한, 단지 재생에서 DEV 모드와 PROD 모드의 차이를주의한다. Play 개발자가 디자인 모드를 결정하면 서버가 시작될 때 클래스가 컴파일되고 핫 리로드를 확인하지 않습니다. 이는 PROD 모드에서 코드가 실제로 변경되지 않아야하기 때문에 의미가 있습니다.

DEV 모드에서 Java 파일은 새로운 요청이 수신 될 때마다 업데이트가 있는지 확인되고 변경된 파일은 자동으로 다시 컴파일되며 오류는 브라우저에 직접 표시됩니다. 이 과정은 DEV 모드에서 매우 생산적입니다. 왜냐하면 코드를 자주 바꿀 것이고 즉각적인 피드백이 매우 강력하기 때문입니다.

+0

우수. 그것은 매우 흥미 롭습니다. 링크와 통찰력에 감사드립니다. – mckamey

+0

@Codemwnci이 접근법은 클래스의 모든 변경 (예 : 메소드 서명 또는 상속)에서 작동합니까? –

+0

해야합니다. 계층 구조의 클래스가 변경되었음을 인식하고 그에 따라 다시 컴파일하십시오. – Codemwnci