Jetty7 - 此插件更名為jetty-maven-plugin,以便更符合maven2的協定。為了在Web應用做快速應用 開發做准備,詳見多Web應用源目錄。
為了在Jetty裡運行一個Web應用,你如果按照Maven默認的做法構造(resources文件存 放,${basedir}/src/main/webapp下Classes文件存放在${project.build.outputDirectory}下,web.xml 的配置描述${basedir}/src/main/webapp/WEB-INF/web.xml),你不需要配置任何其它東西。
只需輸入:
mvn jetty:run
這將在端口為8080的Jetty服務器上啟動你的項目。Jetty將持續運行,直到插件是明確停止,例如, 按下<ctrl-c>,您也可以使用mvn jetty:stop命令。
委托這個插件運行Web應用是非常方便的,因為它可以配置成能定期掃描Web應用的任何改變和自動部 署Web應用。這就可以消除開發周期中編譯和部署的步驟從而更加富有成效。你使用的IDE時對項目做的任 何改變,都將直接自動導入到當前運行的web容器裡,使您可以立即對其進行測試,立竿見影。
如果不管出於什麼原因,你總不能運行一個未組合過的web應用吧,在下文討論中提到這個插件同樣也 支持jetty:run-war和jetty:run-exploded命令。
關於其他命令的更多信息請查閱Jetty文檔中的mvn jetty:run page、mvn jetty:run-exploded page 、mvn jetty:run-war page。
自動執行插件
有時候,例如在做集成測試時,你當然希望在測試開始時自動運行你的項目,測試完成時停止,而不 只是手動的在命令行執行mvn jetty:run吧。
要做到這一點,你需要為jetty 插件創建幾個<execution>腳本,並使用 <daemon>true</daemon>配置選項來預防Jetty無限期運行,迫使它只在執行Maven時才運行 。
像下面pom.xml片段中描述的pre-integration-test和post-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.plugins的groupId來查找插件的,即使這個groupId跟上 面要表達的內容完全不同。為了更明確的指向這個groupId是我們需要的插件,唯一的辦法就是在 settings.xml也做如下設置:
<profile>
...
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
</profile>
如何通過命令行停止插件
委托Jetty插件無限期運行的目標包括run、run-war和run-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的端口監聽。如果你不指定任 何一個NIO的org.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.xml和war文件。如果有任何變化,它都將重新打包並部署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/classes和WEB-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內置的日志記錄器。
其實Jetty的JSP引擎已經包含了一個日志依賴。如果你使用JSP 2.0(即你運行的Java虛擬機[JVM]版本 <1.5),這個JSP引擎依賴於commons-logging。默認的commons-logging日志記錄器在記錄信息為INFO 及以上級別[DEBUG,WARN,ERROR]時,將提供插件使用的jcl04-over-slf4j和simple-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>
用-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已 經沒有什麼特別的日志依賴。