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的方式

没了,我知道的就这几种方式,其实我一直使用的是第二种方式,简单方便,还容易修改