1. 程式人生 > >maven學習四:maven整合jetty外掛釋出web專案

maven學習四:maven整合jetty外掛釋出web專案

本地環境

jdk1.7, eclipse4.5, jetty8.1.6, maven3.2

pom.xml檔案配置

在pom.xml檔案中新增jetty外掛

<build>
 <plugins>
  <plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>8.1.16.v20140903</version>
    </plugin>
 </plugins>
</build>
<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>7.6.17.v20150415</version>
</plugin>

Jetty 8 必須 Jdk 1.6+,Servlet 3.0,類似於 Tomcat 7,最新 Release 版本:

<plugin>
  <groupId>org.mortbay.jetty</groupId
>
<artifactId>jetty-maven-plugin</artifactId> <version>8.1.16.v20140903</version> </plugin>

Jetty 9 必須 Jdk 1.7+,Servlet 3.0+,類似於 Tomcat 8,最新 Release 版本:

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId
>
<version>9.2.10.v20150310</version> </plugin>

國內很多應用也許會去升級JDK版本,但往往還在使用Servlet2.5做開發,所以本文使用 Jetty 8 作為案例。

啟動和停止

命令列方式啟動jetty mvn jetty:run ,可以通過 ctrl+c 停止jetty服務。或者在eclipse中選中專案右擊Run As–Maven build…在Goals中輸入 jetty:run 即可。
eclipse中執行jetty服務

jetty8部署的專案Context path預設為/ 也就是說專案的訪問入口是http://localhost:8080/(不帶專案名)就可以直接訪問。如果你希望通過命令mvn jetty:stop 執行關閉jetty服務,那麼你需要在pom.xml中配置如下資訊:

<bulid>
  <plugins>
    <plugin>
       <configuration>  
         <stopKey>shutdown</stopKey>  
         <stopPort>8099</stopPort>  
       </configuration>  
    <plugin>
  <plugins>
<bulid>

你仍可以通過 mvn jetty:run啟動 jetty 服務,可以通過 mvn jetty:stop 來停止 jetty 服務。

取消對映檔案

jetty 預設開啟了 useFileMappedBuffer,在 jetty 執行期間,頁面所使用的靜態檔案(如 css,html,jsp 等檔案)不允許修改。如果你嘗試去修改它
們,儲存的時候就會出現 Save could not be completed. 如下截圖:
這裡寫圖片描述
解決辦法,找到 %repo%/org/eclipse/jetty/jetty-webapp/9.2.8.v20150217/jetty-webapp9.2.8.v20150217.jar
(%repo% 表示你本地的 maven 倉庫的目錄,另外將 9.2.8.v20150217換成你所使用的版本)。用壓縮工具開啟它, 找到 jetty-webapp-9.2.8.v20150217.jar/org/eclipse/jetty/webapp/webdefault.xml,
將 webdefault.xml 檔案解壓縮一份出來,用文字編輯器開啟它,搜尋找到
useFileMappedBuffer 配置的行(該xml檔案的157行),將 true 改成 false 以禁掉快取。

<init-param>    
  <param-name>useFileMappedBuffer</param-name>    
  <param-value>false</param-value>    
</init-param> 

備註:先確認 jetty 服務已經停止,將原檔案
jetty-webapp-9.2.8.v20150217.jar/org/eclipse/jetty/webap/webdefault.xml 刪除,將剛才那份修改好的 webdefault.xml 檔案重新壓縮排去即可。
案例:我本地修改
1.找到對應的jar包如:
這裡寫圖片描述
2.選中該jar檔案右擊解壓檔案解壓到當前資料夾如下截圖:
這裡寫圖片描述
3.開啟解壓後的檔案找到webdefault.xml檔案並進行如下操作:
這裡寫圖片描述
這裡寫圖片描述
4.把webdefault.xml檔案賦值到本地“src/main/resources”下並在pom.xml中新增如下配置:
這裡寫圖片描述

埠配置

jetty 預設使用的埠是 8080命令列的方式修改埠的命令是:mvn -Djetty.port=8095 jetty:run pom.xml 配置方式如下:

<configuration>  
   <connectors>
    <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
    <port>8095</port>               
    <maxIdleTime>60000</maxIdleTime>
  </connector>
 </connectors>  
</configuration>

自動熱部署

在pom.xml 中新增如下配置:

<configuration>
   <scanIntervalSeconds>2</scanIntervalSeconds>
</configuration>

預設值是 0。大於 0 的數值表示開啟,0 表示關閉,單位為秒。以配置數值為一個週期,自動的掃描檔案檢查其內容是否有變化,如果發現檔案的內容被改變,則自動重新部署運用。
命令列的方式:mvn -Djetty.scanIntervalSeconds=2 jetty:run

手動重新載入

在 pom.xml 檔案中新增如下配置,reload 的可選值 :[automatic|manual]

 <configuration>  
  <reload>manual</reload>  
</configuration> 

預設值為 automatic,它與大於 0 的 scanIntervalSeconds 節點一起作用,實現自動熱部署的工作。設為 manual 的好處是,當你改變檔案
內容並儲存時,不會馬上觸發自動掃描和重部署的動作,你還可以繼續的修改,直至你在 Console 或命令列中敲回車鍵(Enter)的時候才觸發重新載入的動作。這樣可以更加的方便除錯修改。
命令列的方式是:mvn -Djetty.reload=manual jetty:run 。

訪問日誌

在pom.xml 檔案新增如下配置:

<configuration>  
  <requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">  
    <filename>target/access-yyyy_mm_dd.log</filename>
    <filenameDateFormat>yyyy_MM_dd</filenameDateFormat>
    <logDateFormat>yyyy-MM-HH:mm:ss</logDateFormat>
    <logTimeZone>GMT+8:00</logTimeZone>
    <append>true</append>
    <logServer>true</logServer>
    <retainDays>120</retainDays>
    <logCookies>true</logCookies>
   </requestLog>
</configuration> 

org.eclipse.jetty.server.NCSARequestLog 是 org.eclipse.jetty.server.RequestLog 的一個實現類。
org.eclipse.jetty.server.NCSARequestLog 是一種偽標準的 NCSA 日誌格式。下面是一些節點引數的解釋:
filename:日誌檔案的名稱
filenameDateFormat:日誌檔案的名稱的日期格式,它要求日誌檔名必須含有 yyyy_mm_dd 串
logDateFormat:日誌內容的時間格式
logTimeZone:時區
append:追加到日誌
logServer:記錄訪問的主機名
retainDays:日誌檔案儲存的天數, 超過刪除
logCookies:記錄 cookies
啟動 jetty 服務,在專案的 target 目錄下會生成一個 access-2015_06_23.log 檔案,該檔案中的其中一條記錄如下:

localhost 0:0:0:0:0:0:0:1 - - [2015-06-23 01:17:05] “GET /css/main.css HTTP/1.1” 304 -
http://localhost:8095/” “Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0” “JSESSIONID=2gyikovul2iz168116l2afo4f”

web上下文

最常用的是 contextPath,它的配置如下:

<configuration>   
  <webApp>  
     <contextPath>/${project.artifactId}</contextPath>  
  </webApp>  
</configuration>  

contextPath 的預設值的 /,${project.artifactId} 引用了 節點的值,即專案的名稱。
專案的靜態資原始檔目錄預設是 src/main/webapp,如果靜態資源目錄有多個,或者不在預設的 src/main/webapp 目錄下,可做如下配置:

<configuration>  
 <webApp>
   <contextPath>/${project.artifactId</contextPath>
   <resourceBases>
     <resourceBase>${project.basedir}/src/main/webapp</resourceBase>   
     <resourceBase>${project.basedir}/commons</resourceBase>  
   </resourceBases>
 </webApp>
</configuration> 

完整配置

<build>  
  [...]  
  <plugins>  
    <plugin>  
       <groupId>org.eclipse.jetty</groupId>  
       <artifactId>jetty-maven-plugin</artifactId>  
       <version>8.1.9.v20130131</version>  
       <configuration>  
         <connectors>
           <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
             <port>8095</port>
             <maxIdleTime>60000</maxIdleTime>
          </connector>
         </connectors>  
         <stopKey>shutdown</stopKey>  
         <stopPort>8099</stopPort>  
         <!-- 
         <scanIntervalSeconds>2</scanIntervalSeconds> 
         -->  
         <reload>manual</reload>  
         <dumpOnStart>true</dumpOnStart>  
         <webApp>  
        <contextPath>/${project.artifactId</contextPath>  
         <!--  
         <resourceBases> 
            <resourceBase>${project.basedir}/src/main/webapp</resourceBase> 
            <resourceBase>${project.basedir}/commons</resourceBase>  
        </resourceBases>  
        -->  
        </webApp>  
        <requestLog implementation="org.eclipse.jetty.server.NCSARequestLog"> 
       <filename>target/access-yyyy_mm_dd.log</filename>        <filenameDateFormat>yyyy_MM_dd</filenameDateFormat>  
        <logDateFormat>yyyy-MM-dd HH:mm:ss</logDateFormat>  
        <logTimeZone>GMT+8:00</logTimeZone>  
        <append>true</append>  
        <logServer>true</logServer>  
        <retainDays>120</retainDays>  
        <logCookies>true</logCookies>  
        </requestLog>  
      </configuration>  
    </plugin>  
  </plugins>  
</build>  

配置完成後執行jetty服務,訪問瀏覽器檢視是否正常訪問
如下截圖表示部署成功,且jetty埠號修改成功
這裡寫圖片描述
瀏覽器訪問:localhost:8095/jQuery
這裡寫圖片描述
備註:在pom.xml中若是修改了檔案,則必須更新maven專案,然後選中pom.xml檔案“Run AS”–“Maven build…”–“clean compile”、“clean package”、“clean install”
檢視控制檯是否build success,若是不進行上述操作,直接執行jetty:run控制檯會報錯:
LifecyclePhaseNotFoundException
http://cwiki.apache.org/confluence/display/MAVEN/PluginConfigurationException