新一轮学习——Jetty官方文档及源码阅读(二)
Jetty配置指南
(1) 发布项目到Jetty
剖析Web Application
web application可以将所有的文件放到一个目录树并捆绑到一个War发布包。
/WEB-INF/:用于存放不想让用户通过浏览器直接访问的资源
/WEB-INF/web.xml:发布者用于定义各种web application行为和参数的地方
/WEB-INF/classes/:编译过的java类文件
/WEB-INF/lib/:jar包存放目录
WebAppClassloader会首先从/WEB-INF/classes中加载文件,之后再从/WEB-INF/lib/中加载。
自动化Web Application
发布web application的大多数技术就是围绕着放置一个war或者war的解压文件们到${jetty.base}/webapps/目录,这样Jetty的发布扫描器(deployment scanner)就会检测到它们并将其发布到具有同样名称的Context path下。
配置特定的web application发布项目
jetty发布描述文件**.xml通过创建一个ContextHandler实例来发布Jetty
默认情况下,Jetty查看$JETTY_HOME/webapps目录下的xml文件。
这个xml文件会配置WebAppContext类,其中有两个节点,分别为war和contextPath。
使用SystemProperty和Property元素都可以。举个例子:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/wiki</Set> <Set name="war">/opt/myapp/myapp.war</Set> </Configure> |
使用SystemProperty指定myapp.home=/opt/myapp,那么上述文件变为下面这个样子:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/wiki</Set> <Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set> </Configure> |
发现这样写的好处了吗?那就是每次根目录变化的时候,只要重新指定myapp.home的值就可以,改动成本降到了最低。
注:为了保证你的web.xml文件被检测到,你需要设置下validateXml属性值为true。如下:
<Call name="setAttribute"> <Arg>org.eclipse.jetty.webapp.validateXml</Arg> <Arg type="Boolean">true</Arg> </Call> |
其他配置项:
extractWAR:不允许解压war
由于web.xml是在发布描述文件之后进行加载的,所以它的属性会覆盖发布描述文件中的。
下面的配置文件检索了servlet content并设置了一个初始参数。
下面是使用web.xml覆盖描述文件:
这个特性使得不破坏war文件的情况下增加参数或servlet mappings。
下面是配置webContext的同时又配置了一个数据库连接池,如果web.xml不包含这个data source的引用,包含它可以覆盖之前的。
注:WebAppContext的javadoc是一个不错的信息来源。
发布WebAppContext过程:
org.eclipse.jetty.webapp.Configuration接口有很多实现类,每个类都对应一个特定的功能。
默认的配置类:
剖析配置类:
一个配置类在webAppContext的生命周期中会经历5次调用:
preConfigure-resource,configure-class,postConfigure-clear resource,deconfigure-undo resource,destroy-delete war
通过创建额外的configuration来扩展容器支持:
下面列举两个例子:
a JNDI configuration
JNDI在web应用中检视容器和环境的连接资源状况,使用了两个额外的配置:
这两个配置必须在org.eclipse.jetty.webapp.JettyWebXmlConfiguration之前按照顺序插入进来。
b Annotation Configuration
这里只需要一个额外的configuration类来提供servlet注解的检视:
设置配置列表:
a 直接在webAppContext中配置,如下:
b 通过deployer:
如果使用了deployer,则需要在WebAppProvider中设置这个列表:
配置静态内容的发布过程:
需要用到ResourceHandler
热部署:
如果一个web application或者一个context descriptor加入到目录中,Jetty’s Deployment(DM)发布新的context。如果context descriptor更新或者创建了,DM会经历停止,重新配置,重新发布过程。如果这个context移除了,DM就会停掉它并将其移出服务器。
配置WebAppProvider属性时下面行为可以被控制:
monitoredDirName:发布web application的目录
scanInterval:检视monitoredDirName的间隔时间(秒)。0代表不支持热部署,web application只能在启动时发布。
默认地址是${jetty.home}/etc/jetty-deploy.xml。
首先配置开启deploy模块,然后设置。详见下一讲发布架构。