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的方式
没了,我知道的就这几种方式,其实我一直使用的是第二种方式,简单方便,还容易修改