新一轮学习——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模块,然后设置。详见下一讲发布架构。

猜你喜欢

转载自my.oschina.net/u/216330/blog/1627516