在 jetty9 上使用 xml 部署 war 文件

Deploying war file using xml on jetty9

我正在尝试在 jetty9 上部署一个 war 文件,如果我将它放入 webapps 文件夹,它工作正常,但我想使用 xml 文件部署它。

这是我得到的异常:

2015-10-22 17:36:39.593:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@61a485d2{/myapp,file:///tmp/jetty-openbd.war-_myapp-any-1881803922382581907.dir/webapp/,null}{/opt/openbd.org/openbd.war}
java.lang.NullPointerException
    at org.eclipse.jetty.webapp.MetaInfConfiguration.preConfigure(MetaInfConfiguration.java:77)
    at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:474)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:510)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.xml.XmlConfiguration.run(XmlConfiguration.java:1510)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1435)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:214)
    at org.eclipse.jetty.start.Main.start(Main.java:457)
    at org.eclipse.jetty.start.Main.main(Main.java:75)

和我的 xml :

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!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">/myapp</Set>
  <Set name="war">/opt/openbd.org/openbd.war</Set>
</Configure>

我试过 <Set name="extractWAR">true</Set> 但没有成功。

我也用了--debug,但没有提供任何线索..

我做错了什么?码头版本:jetty-9.3.3.v20150827

因此,对于您的场景,您需要了解 ${jetty.base}${jetty.home} 的运作方式。

第 1 步:${jetty.home} 目录

下载 jetty 发行版并将其解压到任何您想要的路径。

现在这是您的 ${jetty.home} 目录。

这些是关于 ${jetty.home}

的最重要的事实
  • 请勿编辑。
  • 不要改变任何东西。
  • 不要删除任何东西。
  • 不要管它。

如果需要,您的计算机上可以有多个 ${jetty.home} 目录。他们不会互相踩踏或造成任何问题。

第 2 步:${jetty.base} 目录

${jetty.home} 目录之外创建一个新目录。

这个现在空白的新目录是您 ${jetty.base}.

的开始

A ${jetty.base} 表示特定 Jetty 实例的配置。您也可以有多个 ${jetty.base} 目录。每个目录代表一个 运行 Jetty 的唯一实例。

${jetty.base} 的基本配置是 start.ini,它是一组用于启动码头的命令行参数。 (类似于所有 Eclipse RT 项目的工作方式)

要使用命令行工具初始化 ${jetty.base},您可以使用 ${jetty.home}/start.jar 及其 --add-to-start=<module> 工具。

示例:

$ cd /path/to/my.base
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=http,deploy,websocket

恭喜您刚刚初始化了 ${jetty.base} 目录。

第 3 步:添加 WebApps

由于您在上面的步骤中选择了 deploy 模块,您现在有了一个 ${jetty.base}/webapps,Jetty 使用它来自动部署其中找到的各种 Web 应用程序。

请参阅 the Deployment Architecture 上的文档以了解它寻找什么以及如何部署。

在您的情况下,只需将 myapp.xml 放入 ${jetty.base}/webapps/ 目录即可。

Note: Using the deploy module as-is, will only monitor and deploy from the ${jetty.base}/webapps/ directory. No other directory is looked in, or monitored for web applications. Not even the ${jetty.home}/webapps/ directory.

监控目录可以通过 ${jetty.base}/start.ini 中的 属性 配置。只需设置 jetty.deploy.monitoredDir=<relative-path> 即可监视此新路径(无需编辑 jetty-deploy.xml)。监控目录配置为始终在指定的${jetty.base}目录下。由于 ${jetty.base} 目录可以位于文件系统的任何位置,因此使用 ${jetty.base} 工具应该没有问题。

第 4 步:运行码头

这也不难。

$ cd /path/to/my.base
$ java -jar /path/to/jetty-dist/start.jar

恭喜你有一个 运行 码头。

第 5 步:(奖励)列出配置

有两种方法可以查看配置的外观。

  1. 在启动 jetty 之前查看服务器配置。
$ cd /path/to/my.base
$ java -jar /path/to/jetty-dist/start.jar --list-config
  1. 查看服务器完全启动后的状态。
$ cd /path/to/my.base
$ java -jar /path/to/jetty-dist/start.jar jetty.server.dumpAfterStart=true