文章出處

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


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()