部署特定的web应用 - jetty

半兽人 发表于: 2016-03-18   最后更新时间: 2016-03-23  
  •   1 订阅,1279 游览

部署特定的web应用


使用自动 Web 应用程序部署模型是快速简便,但有时候你可能需要调整某些部署的属性(例如,你想调整上下文地址,不基于文件名称,或者你想为web应用定义一个特殊的数据库连接池)。你可以使用jetty 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" "http://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" "http://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" "http://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" "http://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" "http://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" "http://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 设置说明,请参阅文档。








发表于: 1年前   最后更新时间: 1年前   游览量:1279
上一条: jetty自动部署web应用
下一条: WebAppContexts的部署处理 - jetty
评论…

  • 评论…
    • in this conversation
      提问