嵌入式 Jetty 停止提供静态内容

Embedded Jetty stops serving static content

我有一个嵌入式 Jetty 应用程序,其中 Jetty 提供了两件事:

JS 文件正在对 servlet 进行 REST 调用。一切都很好。

我注意到,在 运行 大约一周后,API 仍然有效,但如果我尝试获取 HTML 文件,我会得到以下信息:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /web/. Reason:
<pre>    Not Found</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.4.v20170414</a><hr/>

</body>
</html>

这里可能出了什么问题?

不确定这是否有意义,但我正在 Amazon AWS EC2 实例中部署它。我无法想象 EC2 正在做一些让 /web 目录消失的事情。

我假设您的 XML-fragment 设置网络应用程序看起来像这样:

<Call name="addHandler">
    <Arg>
        <New class="org.eclipse.jetty.webapp.WebAppContext">
            <Set name="contextPath">/</Set>
            <Set name="war">./path/to/webapp.war</Set>
            <Set name="extractWAR">True</Set>
            <Set name="copyWebInf">True</Set>
        </New>
    </Arg>
</Call>

发生的情况是 war 的内容被提取到系统 属性 java.io.tmpDir 指定的临时目录中的目录中。如果不自己设置这个目录,这是操作系统的临时目录,例如/tmp 在 Linux 上。这在启动期间完成一次,并假设该目录在整个过程中存在 运行.

在 Linux 系统上,您经常有一个 cron 作业正在删除 /tmp "taking care" 中的旧条目,这些仍然是 Jetty 所需的重要目录,导致这些错误。 servlet 仍然可以访问,因为它们是由 class 加载器加载的 java classes,所以删除它们最初加载的 jar 无关紧要(当然除外您尝试访问以前未访问过的 servlet)。

一个解决方案是 java.io.tmpDir 你自己指定,指向你自己控制的目录。