通過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
刷新頁面即可重新加載資源。