分類  >  Web前端 >

Maven Jetty Plugin 配置指南(通譯)

tags:    時間:2013-12-09 23:34:06
Maven Jetty Plugin 配置指南(翻譯)

 

Jetty 版本信息

 

     Jetty7 - 此插件更名為jetty-maven-plugin,以便更符合maven2的協定。為了在Web應用做快速應用開發做準備,詳見Web應用源目錄

  為了在Jetty里運行一個Web應用,你如果按照Maven默認的做法構造(resources文件存放,${basedir}/src/main/webappClasses文件存放在${project.build.outputDirectory}下,web.xml的配置描述${basedir}/src/main/webapp/WEB-INF/web.xml),你不需要配置任何其它東西。

 只需輸入:mvn jetty:run

    這將在埠為8080Jetty伺服器上啟動你的項目。Jetty將持續運行,直到插件是明確停止,例如,按下<ctrl-c>,您也可以使用mvn jetty:stop命令。

   委託這個插件運行Web應用是非常方便的,因為它可以配置成能定期掃描Web應用的任何改變和自動部署Web應用。這就可以消除開發周期中編譯和部署的步驟從而更加富有成效。你使用的IDE時對項目做的任何改變,都將直接自動導入到當前運行的web容器里,使您可以立即對其進行測試,立竿見影。

   如果不管出於什麼原因,你總不能運行一個未組合過的web應用吧,在下文討論中提到這個插件同樣也支持jetty:run-warjetty:run-exploded命令。

    關於其他命令的更多信息請查閱Jetty文檔中的mvn jetty:run pagemvn jetty:run-exploded pagemvn jetty:run-war page

自動執行插件

   有時候,例如在做集成測試時,你當然希望在測試開始時自動運行你的項目,測試完成時停止,而不只是手動的在命令行執行mvn jetty:run吧。

   要做到這一點,你需要為jetty 插件創建幾個<execution>腳本,並使用<daemon>true</daemon>配置選項來預防Jetty無限期運行,迫使它只在執行Maven時才運行。

  像下面pom.xml片段中描述的pre-integration-testpost-integration-test 就是用來觸發執行和關閉Jetty

<plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <version>6.1.10</version>

        <configuration>

                <scanIntervalSeconds>10</scanIntervalSeconds>

                <stopKey>foo</stopKey>

                <stopPort>9999</stopPort>

        </configuration>

        <executions>

                <execution>

                        <id>start-jetty</id>

                        <phase>pre-integration-test</phase>

                        <goals>

                                <goal>run</goal>

                        </goals>

                        <configuration>

                                <scanIntervalSeconds>0</scanIntervalSeconds>

                                <daemon>true</daemon>

                        </configuration>

                </execution>

                <execution>

                        <id>stop-jetty</id>

                        <phase>post-integration-test</phase>

                        <goals>

                                <goal>stop</goal>

                        </goals>

                </execution>

        </executions>

</plugin>

 

         注意Maven默認都是通過org.apache.maven.pluginsgroupId來查找插件的,即使這個groupId跟上面要表達的內容完全不同。為了更明確的指向這個groupId是我們需要的插件,唯一的辦法就是在settings.xml也做如下設置:

       <profile>

                 ...

                                       <pluginGroups>

                                         <pluginGroup>org.mortbay.jetty</pluginGroup>

                                       </pluginGroups>

</profile>

 

如何通過命令行停止插件

  委託Jetty插件無限期運行的目標包括runrun-warrun-exploded。你可以在視窗控制終端(如DOS窗口)使用<ctrl-c>關閉它,或者在另一個視窗控制終端使用stop目標關閉。如果你希望能使用mvn jetty:stop 執行關閉命令,則需要你在插件中配置一個特殊的埠和控制鍵。下面是一個例子配置:

<plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <version>6.1.10</version>

        <configuration>

          <stopPort>9966</stopPort>

          <stopKey>foo</stopKey>

        </configuration>

</plugin>

開始:

mvn jetty:start

關閉:

mvn jetty:stop

如何配置插件

配置公共的run, run-war run-exploded 目標

  不管你執行哪一個Jetty目標,下述的配置參數都是可用的。一般來說它們分為應用於Web容器的配置和應用於具體web應用的配置:

容器級配置

           Connectors 可選.一組org.mortbay.jetty.Connector對象,包含jetty的埠監聽。如果你不指定任何一個NIOorg.mortbay.jetty.nio.SelectChannelConnector將默認配置一個8080埠。當然,你可以在命令行使用系統參數jetty.port 改變默認埠。例如"mvn -Djetty.port=9999 jetty:run"。另外,您也可以指定許多您想要的連接。  
         
jettyConfig 可選。除插件配置參數外,你也可以指定一個jetty.xml文件的路徑。當你有其他的web應用和操作需要部署時,或者一些你無法在插件中配置的jetty對象,你就可以使用到它,

             scanIntervalSeconds 可選[]在很短的時間間隔內在掃描web應用檢查是否有改變,如果發覺有任何改變則自動熱部署。默認為0,表示禁用熱部署檢查。任何一個大於0的數字都將表示啟用。

              systemPropertie 可選。它們允許你在設置一個插件的執行操作時配置系統屬性.更多的信息請查閱Setting System Properties.

              userRealms 可選。一組org.mortbay.jetty.security.UserRealm實現。請注意,它沒有一個默認的Realm。如果你在你的web.xml應用了一個Realm,你需要在這裡指定一個對應的Rleam

              requestLog 可選。一個org.mortbay.jetty.RequestLog請求日誌介面的實現。比如org.mortbay.jetty.NCSARequestLog就是一個作為NCSA格式的實現。

[註:(美國)國家超級計算技術應用中心 (NCSA) 公用格式是常用的標準日誌格式]

 

手動重載

Jetty 6.2.0pre0版本起,添加了一個新的可用組件,用於控制web應用的重新部署。

配置參數:<reload>[manual|automatic]</reload>

當你設置成手動模式后,web應用不會自動的掃描和重部署。相反,用戶可以控制的Web應用時,通過鍵入回車換行鍵重載。當設置成自動模式時,將根據scanIntervalSeconds參數的設置不定時的掃描和自動重部署。你也能通過在命令行使用系統參數
-Djetty.reload 配置選擇重載的模式。

比如:"mvn -Djetty.reload=manual jetty:run" 將強制手動重載,不管pom.xml文件里如何配置。同理: "mvn -Djetty.reload=automatic -Djetty.scanIntervalSeconds=10 jetty:run" 每隔十秒中後台將重載一次,而不管pom.xml文件里如何配置。

 

Web應用級配置

             contextPath 可選。這個contex地址指向你的webapp.默認情況下,它被設置成該項目的pom.xml<artifactId>。當然你也可以設置一個你喜歡的從而覆蓋它。

             tmpDir 可選。它作為web應用的臨時目錄。它默認設置在{${basedir}/target}下,但是你也可在這裡改變它的路徑。

             overrideWebXml 可選. 它是一個應用於web應用的web.xml的備用web.xml文件.這個文件可以存放在任何地方.你可以根據不同的環境中(如測試、開發等等)利用它增加或修改一個web.xml配置.

             webDefaultXml 可選. webdefault.xml文件用來代替webapp默認提供給jetty的文件.

6.1.6rc0發行版開始,一個替代的更靈活的方式是配置web應用時使用webAppConfig元素代替上面列出的那些單獨的參數。使用webAppConfig元素,你能有效的調用org.mortbay.jetty.webapp.WebAppContext類中任何setter方法。下面顯示的列子將展示這個元素跟它上面的例子比較是如何配置同樣的特性的(當然它們還有更多的特性能讓你設置)

<project>

 ...

 <plugins>

    ...

      <plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <configuration>

          <scanIntervalSeconds>10</scanIntervalSeconds>

          <!—web應用的配置 -->

          <contextPath>/biggerstrongerbetterfaster</contextPath>

          <tmpDir>target/not/necessary</tmpDir>

          <webDefaultXml>src/main/resources/webdefault.xml</webDefaultXml>

          <overrideWebXml>src/main/resources/override-web.xml</overrideWebXml>

          <!—jetty6.1.6rc0, 你能用webAppConfig 元素代替

          <webAppConfig>

            <contextPath>/test</contextPath>

            <tempDirectory>${project.build.directory}/work</tempDirectory>

            <defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>

            <overrideDescriptor>src/main/resources/override-web.xml</overrideDescriptor>

          </webAppConfig>

          -->

          <!—容器的配置 -->

          <jettyConfig>/my/special/jetty.xml</jettyConfig>

         <connectors>

            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">

              <port>9090</port>

              <maxIdleTime>60000</maxIdleTime>

            </connector>

          </connectors>

          <userRealms>

            <userRealm implementation="org.mortbay.jetty.security.HashUserRealm">

              <name>Test Realm</name>

              <config>etc/realm.properties</config>

            </userRealm>

          </userRealms>

          <requestLog implementation="org.mortbay.jetty.NCSARequestLog">

            <filename>target/yyyy_mm_dd.request.log</filename>

            <retainDays>90</retainDays>

            <append>true</append>

            <extended>false</extended>

            <logTimeZone>GMT</logTimeZone>

          </requestLog>

        </configuration>

      </plugin>

 </plugins>

</project>


jetty:run的配置

  run目標允許你把你未打包的web應用部署到Jetty.它包含在你的pom.xml文件的一部分元素里。下面額外的配置參數都是可用到的:

  classesDirectory 這是你的web應用編譯的classes存放的路徑。你很少需要設置這個參數,其實可以在你的pom.xml<build><outputDirectory>替代它。

webAppSourceDirectory 默認設置在${basedir}/src/main/webapp下。如果你的源文件夾結構跟左邊不同,就可以設置這個參數。
  webXml 
默認設置在${maven.war.webxml}或者${basedir}/src/main/webapp/WEB-INF/web.xml,無論哪個文件都不是空的。如果覺得前兩者都不合適,就設置它。

          jettyEnvXml 可選。它指向一個jetty-env.xml文件的路徑。允許你創建JNDI綁定並滿足web.xml<env-entry><resource-env-ref><resource-ref>元素中的條件。當然這個文件的使用範圍僅僅在你的當前應用和其他應用同時部署時它並沒有共享的情況下。(例如使用一個jettyConfig文件)    

          scanTargets 可選。周期性的掃描除了插件自動掃描外的文件和文件夾列表。

          scanTargetPatterns 可選。如果你想掃描有一長串的額外文件,通過使用模式匹配表達式制定它們更加方便,它可以用來替代 <scanTargets>參數的枚舉展示。這個參數包含一組<scanTargetPattern>。每一個都是由一個<directory><includes>[或者<excludes>]參數來指定文件的匹配模式。

下面的示例設置了所有這些參數:

<project>

 ...

 <plugins>

    ...

      <plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <configuration>

          <webAppSourceDirectory>${basedir}/src/staticfiles</webAppSourceDirectory>

          <webXml>${basedir}/src/over/here/web.xml</webXml>

          <jettyEnvXml>${basedir}/src/over/here/jetty-env.xml</jettyEnvXml>

          <classesDirectory>${basedir}/somewhere/else</classesDirectory>

          <scanTargets>

            <scanTarget>src/mydir</scanTarget>

            <scanTarget>src/myfile.txt</scanTarget>

          </scanTargets>

          <scanTargetPatterns>

            <scanTargetPattern>

              <directory>src/other-resources</directory>

              <includes>

                <include>**/*.xml</include>

                <include>**/*.properties</include>

              </includes>

              <excludes>

                <exclude>**/myspecial.xml</exclude>

                <exclude>**/myspecial.properties</exclude>

              </excludes>

            </scanTargetPattern>

          </scanTargetPatterns>

        </configuration>

      </plugin>

 </plugins>

</project>

  你也可以查看jetty:run parameter reference

配置jetty:run-war

  這個目標將首先把你的web應用打包成一個war文件,再發布到Jetty。如果你設置掃描間隔為非零,Jetty將觀察你的pom.xmlwar文件。如果有任何變化,它都將重新打包並部署war

  配置參數的詳細描述如下:

          webApp 打包后war的路徑。默認為${project.build.directory}/${project.build.finalName}.war。如果目標存儲空間不足,設置它到你的自定義路徑下。

詳細設置如下:

<project>

 ...

 <plugins>

    ...

      <plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <configuration>

          <webApp>${basedir}/target/mycustom.war</webApp>

        </configuration>

      </plugin>

 </plugins>

</project>           

你也可以查看jetty:run-war parameter reference.

配置jetty:run-exploded

  這個目標首先裝配你的web應用到exploded-war文件,再發布到Jetty。如果你設置掃描間隔為非零,Jetty將觀察你的pom.xml, WEB-INF/lib, WEB-INF/classesWEB-INF/web.xml的改變。如果有必要,它都將重新打包並部署war

配置參數的詳細描述如下:

             webApp exploded-war的路徑。默認在${project.build.directory}/${project.build.finalName}但是能通過設置這個參數,從而覆蓋它。

詳細設置如下:

<project>

 ...

 <plugins>

    ...

      <plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <configuration>

          <webApp>${basedir}/target/myfunkywebapp</webApp>

        </configuration>

      </plugin>

 </plugins>

</project>

你也可以查看jetty:run-exploded parameter reference.

設置系統屬性

  你可以為插件的執行操作按name/value成對的方式指定系統屬性。

  請注意,如果發現有系統屬性已經設置過(例如從命令行或者JVM本身),則這些配置的屬性不會覆蓋它們。

  這個特性在整理命令行和保存一系列的鍵盤鍵入操作時是很有用的。

  譬如,你通常會需要產生Commons logging:

  mvn -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog jetty:run

 

  使用了systemProperty配置的命令行可以再次更簡短的運行mvn jetty:run,看下面的pom.xml

<project>

 ...

 <plugins>

    ...

      <plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <configuration>

         ...

         <systemProperties>

            <systemProperty>

              <name>org.apache.commons.logging.Log</name>

               <value>org.apache.commons.logging.impl.SimpleLog</value>

            </systemProperty>

            ...

         </systemProperties>

        </configuration>

      </plugin>

 </plugins>

</project>

注意:你可以按<name>或者<key>的方式指定<systemProperty>的名稱,使用哪個按你的喜好吧。

日誌

  Jetty本身並沒有依賴一個特定的日誌框架,它使用一個內置的日誌記錄器來輸出標準錯誤。不管怎樣,允許了Jetty和其他日誌方法集成,如果在類路徑中發現了一個SLF4J日誌的實現,它的使用將優先於Jetty內置的日誌記錄器。

 其實JettyJSP引擎已經包含了一個日誌依賴。如果你使用JSP 2.0(即你運行的Java虛擬機[JVM]版本<1.5),這個JSP引擎依賴於commons-logging。默認的commons-logging日誌記錄器在記錄信息為INFO及以上級別[DEBUG,WARN,ERROR]時,將提供插件使用的jcl04-over-slf4jsimple-slf4j的實現。

 您可以忽略這一點,按照下列步驟提供自己的commons-logging

1. 使用插件中<dependencies>增加一個commons-logging和一個commons-logging的實現到插件類路徑(log4j)。請注意,如果您想把Jetty 容器的日誌也將發送到這個記錄器,你還應該加上slf4j-jcl這個用於橋接的jar包:

<plugin>

        <groupId>org.mortbay.jetty</groupId>

        <artifactId>maven-jetty-plugin</artifactId>

        <version>6.0-SNAPSHOT</version>

      <configuration>

       <scanIntervalSeconds>5</scanIntervalSeconds>

    </configuration>

     <dependencies>

    <dependency>

          <groupId>commons-logging</groupId>

          <artifactId>commons-logging</artifactId>

          <version>1.1</version>

          <type>jar</type>

     </dependency>

     <dependency>

          <groupId>org.slf4j</groupId>

          <artifactId>slf4j-jcl</artifactId>

          <version>1.0.1</version>

          <type>jar</type>

      </dependency>

      <dependency>

          <groupId>log4j</groupId>

          <artifactId>log4j</artifactId>

          <version>1.2.13</version>

          <type>jar</type>

      </dependency>

   </dependencies>

      </plugin>

   2.用-Dslf4j=false系統屬性運行插件:

    mvn -Dslf4j=false jetty:run

     注意如果你使用的是log4j,你將需要告訴log4j你配置文件的位置。譬如:

     mvn -Dslf4j=false -Dlog4j.configuration=file:./target/classes/log4j.properties jetty:run

  

   如果您使用的是JSP2.1 (即你運行的Java虛擬機[JVM]版本>=1.5 ),那太好了,因為這個JSP已經沒有什麼特別的日誌依賴。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網