部署特定的web应用 - jetty

半兽人 发表于: 2016-03-18   最后更新时间: 2017-10-19 22:00:12  
{{totalSubscript}} 订阅, 8,582 游览

自动 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 设置说明,请参阅文档。

更新于 2017-10-19

查看jetty更多相关的文章或提一个关于jetty的问题,也可以与我们一起分享文章