【說明】今天看了看jetty這個web容器,上午看基礎理論框架知識(后面半點沒用到),下午下載了jetty,並且在上面部署了一個war應用,晚上在做eclipses整合jetty的時候出現了問題,下載插件之后不能運行,隨之又對jetty插件運行方式產生了疑問
一:今日完成
1)jetty的官方簡單介紹
Jetty provides a Web server and javax.servlet container, plus support for HTTP/2, WebSocket, OSGi, JMX, JNDI, JAAS and many other integrations.These components are open source and available for commercial use and distribution.
Jetty is used in a wide variety of projects and products, both in development and production. Jetty can be easily embedded in devices, tools, frameworks, application servers, and clusters. See the Jetty Powered page for more uses of Jetty.
The current recommended version for use is Jetty 9 which can be obtained here: Jetty Downloads. Also available are the latest maintenance releases of Jetty 8 and Jetty 7.
The Jetty project has been hosted at the Eclipse Foundation since 2009. Prior releases of Jetty have existed in part or completely under the Jetty project at the The Codehaus and Sourceforge before that. See the About page for more information about the history of Jetty.
2)啟動jetty
3)了解jetty_base和jetty_home的區別
4)部署test.war
5)安裝插件
二:明日計划
1)搞定插件直接部署到jetty
2)搞定插件直接部署到tomcat
3)了解一下jboss和jetty的聯系
三:疑難問題
1)eclipse里如果用jetty啟動項目,是不是只能用jetty server adapter或run-jetty-run插件啟動,不能用本地的jetty?那以后部署到生產環境怎么保證項目能在生產環境的jetty里運行呢?
2)maven的pom.xml里配置了jetty插件,有什么作用呢?開發環境可以用run-jetty-run啟動,生產環境可以放到webapp里,這個jetty插件在什么時候用?
3)網上說在項目目錄下用mvn jetty:run啟動,如果是生產環境,還要安裝maven?
4)執行這個啟動命令mvn jetty:run,jetty是哪里來的?
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.0.5.v20130815</version>
四:思考總結
上午看的jetty原理和框架知識現在半點用不上,還是等遇到了再詳細研究吧
jetty9.1以后出現了jetty.base這個概念,指的就是你的webapps目錄所在的路徑(當然這個webapps目錄也是可以修改的,但大多數應用都是直接用這個webapps了),分幾種情況說明下:
1、下載下來的jetty直接使用,也就是將你的war文件直接放在解壓目錄的webapps下,然后通過java -jar start.jar啟動,此時的jetty.base和jetty.home都是當前目錄,可以通過java -jar start.jar --list-config來查看下:
2、看到那個demo-base文件夾了么(jetty版本為9.0以后),這個文件夾就是jetty用來做jetty.base的事例用的,進去看下,目錄結構這樣:
demo-base中包含可以啟動一個web應用的所有文件.也就是說,使用這個目錄中的文件也可以啟動jetty,如何啟動的,進入demo-base,然后java -jar ../start.jar進行啟動,再次使用--list-config進行查看,只有很少的內容,且內容來源都是demo-base中,其中有jetty.base和jett.home,看到了吧,不一樣了,jetty.base是當前目錄:
也就是說,可以隨意建立一個目錄當做jetty.base,然后在該目錄中放置war包啟動需要的jetty配置文件即可.
3、在系統內任意目錄建立一個文件夾,當做jetty.base使用(其實和第2種情況一樣,啟動時通過指定start.jar就可以啟動了)
還有幾個點需要注意下:
1、jetty.home默認就是start.jar所在的目錄
2、可以通過在java -jar start.jar后面跟上jetty.base來指定jetty.base目錄:
java -jar start.jar jetty.base=...
3、jetty.home其實就是jetty的默認配置文件、默認的模塊定義目錄;jetty.base就是為了某個webapp自定義的一個配置文件目錄
--list-modules:此命令將返回當前服務所有可用的模塊,同時也會顯示本地的模塊,信息包括模塊實現的順序,依賴模塊以及相應的jar信息

在Jetty9,只有Jetty基路徑下的配置文件被編輯,屬性才會被修改
1、web應用的結構:
在說jetty部署之前先說說servlet規范定義的web應用的結構,應該都很熟悉,這里羅列一下:
WEB-INF/
WEB-INF/lib/
WEB-INF/classes/
WEB-INF/web.xml
以上內容是一個webapp必須有的,其中在啟動的時候jetty的WebAppClassLoader會先從classes中加載類文件,然后在去lib目錄下加載類文件
2、部署方式
jetty支持多種部署方式,比如servlet規范中的滿足以上內容條件的war包,jetty自己提供的xml部署描述符,或者直接就是一個滿足servlet規范的文件夾(war包本來也是要解壓的)
(1)簡單部署,直接將war包或者解壓的war目錄放入jetty.home/webapps目錄下,然后啟動,jetty的部署掃描器會找到部署的內容,然后自動設置contextPath為該war包或war目錄的名字即可完成部署,但要注意war的名字,當war的名字為root.war或者文件夾的名字為war的時候,contextPath就是root,在瀏覽器中訪問的時候就不需要輸入contextPath了,而直接訪問根目錄,比如http://localhost:8080/就可以訪問到root.war這個應用了,當你的jetty只需要部署這一個應用,將其命名為root.war還是可以滴.
當你需要使war包的名字和contextPath不同,這時候怎么辦呢?就是第二種方式:
(2)XML部署描述符,這種方式就是在webapps目錄中不放除了xml文件描述符之外的任何war包或者war目錄,jetty部署掃描器能自動加載到這個xml文件,然后通過xml文件中定義的WebAppContext實例中的war和contextPath屬性來找到你的war包或者war目錄,比如這樣一個xml文件:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/mycontext</Set>
<Set name="war">/home/wilsonp/myapp/myapp.war</Set>
</Configure>
jetty會解析該xml文件,然后自動搜索到myapp.war文件,並定義其contextPath為/mycontext,啟動之后就可以直接輸入http://localhost:8080/mycontext/就能訪問到應用了。
其中WebAppContext中還有其他的屬性:
extractWAR:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/mycontext</Set>
<Set name="war">/home/wilsonp/myapp/myapp.war</Set>
<Set name="extractWAR">false</Set>
</Configure>
通過以上設置,可以在部署myapp.war的時候不用展開該war文件。
還記得在web.xml文件中可以設置應用初始化參數吧?其實也可以在這里進行設置,如下設置,
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/mycontext</Set>
<Set name="war">/home/wilsonp/myapp/myapp.war</Set>
<Set name="extractWAR">false</Set>
<Get name="ServletContext">
<Call name="setInitParameter">
<Arg>myapp.config</Arg>
<Arg>/home/wilsonp/myapp/config/app-config.xml</Arg>
</Call>
</Get>
</Configure>
可以在啟動jetty的時候設置ServletContext參數,參數可以是一個xml文件,jetty會自動解析,但要注意一點,jetty在解析了部署描述符文件之后才會去解析web.xml,這時候如果web.xml中也有和app-config.xml中同名的參數的話會將其覆蓋。
overrideDescriptor:
看如下配置:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/mycontext</Set>
<Set name="war">/home/wilsonp/myapp/myapp.war</Set>
<Set name="extractWAR">false</Set>
<Get name="ServletContext">
<Call name="setInitParameter">
<Arg>myapp.config</Arg>
<Arg>/home/wilsonp/myapp/config/app-config.xml</Arg>
</Call>
</Get>
<Set name="overrideDescriptor">/home/wilsonp/myapp/config/overlay-web.xml</Set>
</Configure>
jetty解析web.xml文件之后會解析overlay-web.xml文件,就是說,可以在這個文件中覆蓋web.xml中的屬性,或者增加一些額外的屬性,免得web.xml文件被改來改去的,麻煩,有了這個屬性就省事了.
jetty還可以配置jndi數據源,自己去看看吧!
(3)第二種方式是放置war包,其實可以放置滿足servlet 規范的任意目錄都可以
(4)還有最后一種就是在jetty9系列之jetty.home和jetty.base中說的jetty.base的方式
沒了,我知道的就這幾種方式,其實我一直使用的是第二種方式,簡單方便,還容易修改