自动 Web 应用程序部署非常的快速简便,但有时候你可能需要调整某些部署的属性(例如,你想调整上下文地址,不基于文件名称,或者你想为web应用定义一个特殊的数据库连接池)。你可以使用Jetty Deployable Descriptor XML File
来完成这种调整。
Jetty部署描述符XML文件
jetty支持通过XML文件构建一个ContextHandler的实例部署web应用。
使用基本的描述符文件
默认安装的jetty,会自动扫描它的 $JETTY_HOME/webapps
目录,若要部署web应用,则需将文件放在该目录中即可。
部署描述符文件本身就是一个配置了 WebAppContext类
的XML文件,在默认安装的情况下,你只需设置2个属性:
war
web应用程序的文件系统路径(或目录)contextPath
上下文路径使用的web应用程序
例如:这是一个描述符文件,项目/opt/myapp/myapp.war
指定上下文路径为/wiki
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/wiki</Set>
<Set name="war">/opt/myapp/myapp.war</Set>
</Configure>
注意
你可以使用系统属性和属性元素,如果你设置系统属性myapp.home=/opt/myapp,你可以重写前面的例子。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
</Configure>
如果你需要修改home路径,你可以简单的改变系统属性,如果你经常为一个app在多版本之间切换。这就非常有用了。
配置先进的描述符文件
如果你看过WebAppContext类的文档,你会发现不仅仅是只有上面提到的2个属性,下面这些例子,是介绍高级描述符文件的:
第一个例子告诉Jetty,在部署的时候不展开WAR文件。这可以让大家知道,不应该更改这个临时解压的WAR,因为这种变化不持续,因此不适用用于web应用程序部署。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<Set name="extractWAR">false</Set>
</Configure>
下一个例子是检索Java EE Servlet的上下文,并设置它的初始化参数。您还可以使用setAttribute方法来设置一个Servlet上下文属性。但是,由于Web应用程序的web.xml文件中的部署描述符之后处理,所以web.xml值会覆盖同名的描述符属性。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<Get name="ServletContext">
<Call name="setInitParameter">
<Arg>myapp.config</Arg>
<Arg><SystemProperty name="myapp.home">/config/app-config.xml</Arg>
</Call>
</Get>
</Configure>
下面的示例设置一个特殊的web.xml覆盖描述符。该描述符是在web应用程序的web.xml之后处理的,因此它可以覆盖相同名称的属性。如果你想添加的参数或附加的Servlet映射没有破开一个打包WAR文件,那此功能是非常有用的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<Set name="overrideDescriptor">/opt/myapp/overlay-web.xml</Set>
</Configure>
接下来的例子不仅是web应用的上下文配置,又是一个数据库连接池(参见数据源的例子,如果web.xml不包含这个数据源的引用,可以使用覆盖描述符的机制(前面的列子)我们的应用程序就可以使用),将其列入:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">org.some.Driver</Set>
<Set name="url">jdbc.url</Set>
<Set name="username">jdbc.user</Set>
<Set name="password">jdbc.pass</Set>
</New>
</Arg>
</New>
</Configure>
还有很多其他的设置,你可以在WebAppContext上进行改变,可以参考javadoc,在war在部署期间,也避免了zip文件异常,无论是自动解压或是否将 web 应用程序的某些部分复制到一个临时位置的 WebAppContext 设置说明,请参阅文档。