Gradle裡配置jetty實現靜態資源的熱部署

黃博文發表於2013-09-05

通過Gradle我們可以很方便的使用內建jetty啟動我們的web程式,在本地進行除錯。但是在使用的過程中,我發現了幾個問題,導致本地除錯的效率大受影響。

  1. 如果使用gradle jettyRun啟動jetty伺服器後,專案裡的靜態資源(jsp,html,JavaScript檔案)都被鎖定了,導致無法實時修改這些靜態資源。

  2. 既然無法實時修改這些靜態資源,那意味著我們做一個很小的改動都需要先停止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
<param-name>useFileMappedBuffer</param-name>
<param-value>false</param-value>

然後在build.gradle加入對此檔案的引用。

1
2
3
[jettyRun, jettyRunWar,jettyStop]*.with {
  webDefaultXml = file("${rootDir}/webdefault.xml")
}

第二種方法是修改專案中的WEB-INF/web.xml檔案,在其中加入這個節點。

1
2
3
4
5
6
7
8
9
<servlet>
    <!-- Override init parameter to avoid nasty -->
    <!-- file locking issue on windows.         -->
    <servlet-name>default</servlet-name>
        <init-param>
            <param-name>useFileMappedBuffer</param-name>
            <param-value>false</param-value>
        </init-param>
</servlet>
  • 解決jetty的hot deploy的問題。

這個就比較簡單了,Gradle的jetty外掛有兩個屬性,一個是reload屬性,需要設定為automatic。另一個屬性是 scanIntervalSeconds,這是指定jetty掃描檔案改變的時間間隔,預設為0,單位是秒。 在build.gradle中加入設定。

1
2
3
4
jettyRun {
  reload ="automatic"
  scanIntervalSeconds = 1
}

齊活。接下來執行gradle jettyRun,待服務啟動起來以後,如果修改了靜態資源,只需要按Ctrl+R重新整理頁面即可重新載入資源。

相關文章