2011-03-07 59 views
20

我很好奇沒有人知道Grails或Play等框架如何檢測代碼中的變化,並自動觸發重新編譯而無需重新啓動應用程序服務器?有沒有特定於Groovy的編譯器或其動態特性的東西,使它容易發生?Grails或Play如何檢測更改和熱重載類?

對於背景,我在構建過程中有一個自定義的代碼生成階段,我希望能夠具有類似的編輯和刷新功能。

預先感謝任何指針,即使我必須篩選代碼以獲取更大的圖片。

編輯:我應該澄清一下,我不打算在servlet容器中的任何應用程序中完成這些操作,以致無法構建Grails插件。即,我正在使用Groovy,但不使用Grails。

EDIT2:這聽起來像玩有一個特定的DEV模式,這使得這個炎熱的重裝:http://www.playframework.org/documentation/1.1.1/main#lifecycle

據我所知,JRebel的執行通過類加載器精心類的版本,但我假設Web框架Grails的一樣或遊戲沒有把它帶到那個水平。

+3

Luke Daley有一篇關於如何爲Groovy類進行熱重載的精彩文章。它可能對你有用:http://ldaley.com/post/653190105/putting-the-artefact-api-to-work-in-your-grails-app – Dana 2011-03-07 23:54:36

+0

這裏有一些關於JRebel如何做到這一點的迷人細節一種通用的方式。我假設Grails不是那麼複雜! http://www.zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/ – mckamey 2011-03-08 02:54:57

+0

我將@ Codemwnci的答案標記爲解決方案,但如果有人對Grails有深入瞭解,我仍然對此感興趣。謝謝! – mckamey 2011-03-09 17:45:16

回答

13

使用Eclipse JDT在運行時進行編譯代碼。

看看下面這個類,它被Play用來在運行時執行必要的編譯。

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

而且,只是要注意在播放的DEV模式和PROD模式之間的區別。這是由Play開發人員做出的設計決定,一旦應用程序進入Production模式,這些類將在服務器啓動時編譯,並且不會檢查熱重載。這是有道理的,因爲在PROD模式下,你的代碼不應該真的在改變。

在DEV模式下,每次收到新請求時都會檢查Java文件的更新,並且所有更改的文件都會自動重新編譯(並且錯誤直接顯示在瀏覽器中)。這個過程在DEV模式下非常高效,因爲您會經常更改代碼,並且即時反饋非常強大。

+0

非常好。這非常有趣。感謝您的鏈接和見解。 – mckamey 2011-03-09 00:42:17

+0

@Codemwnci此方法是否適用於類中的任何更改,例如方法簽名或繼承? – 2012-12-16 07:14:33

+0

它應該這樣做。它應該認識到層次結構中的一個類已經發生了變化,並在後臺進行相應的重新編譯。 – Codemwnci 2012-12-16 10:56:00