通過Gradle我們可以很方便的使用內建jetty啟動我們的web程式,在本地進行除錯。但是在使用的過程中,我發現了幾個問題,導致本地除錯的效率大受影響。
如果使用
gradle jettyRun
啟動jetty伺服器後,專案裡的靜態資源(jsp,html,JavaScript檔案)都被鎖定了,導致無法實時修改這些靜態資源。既然無法實時修改這些靜態資源,那意味著我們做一個很小的改動都需要先停止jetty server,然後修改,再重新啟動jetty server,這樣來回浪費很多時間,尤其是涉及前臺頁面改動時,每調整一個引數都需要重啟jetty。
由於我以前使用過Maven,在Maven裡jetty是可以顯示熱部署的。也就是說如果有靜態檔案被改動,那麼jetty可以實時load並展現。那麼在Gradle裡面實現這個應該也不是難事,花了一些時間搞定了。
- 首先要解決檔案被鎖定的問題。
檔案被鎖定是由於在使用windows系統時,jetty預設在記憶體中對映了這些檔案,而windows會鎖定記憶體對映的檔案。解決的辦法就是修改jetty的配置,讓其在啟動server時將useFileMappedBuffer標誌位設定為false。
設定方法有兩種,一種是修改webdefault.xml檔案中的useFileMappdBuffer標誌位。webdefault.xml檔案是jetty啟動服務的配置檔案,其先於專案中的WEB-INF/web.xml檔案被載入。 jetty包中預設有這個檔案,可以將其提取出來,儲存在專案根目錄下,並修改useFileMappedBuffer節點。
1 2 |
|
然後在build.gradle加入對此檔案的引用。
1 2 3 |
|
第二種方法是修改專案中的WEB-INF/web.xml
檔案,在其中加入這個節點。
1 2 3 4 5 6 7 8 9 |
|
- 解決jetty的hot deploy的問題。
這個就比較簡單了,Gradle的jetty外掛有兩個屬性,一個是reload屬性,需要設定為automatic。另一個屬性是 scanIntervalSeconds,這是指定jetty掃描檔案改變的時間間隔,預設為0,單位是秒。 在build.gradle中加入設定。
1 2 3 4 |
|
齊活。接下來執行gradle jettyRun
,待服務啟動起來以後,如果修改了靜態資源,只需要按Ctrl
+R
重新整理頁面即可重新載入資源。