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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM