Embedded Jetty停止提供静态内容

时间:2017-09-04 15:46:21

标签: java servlets amazon-ec2 jetty embedded-jetty

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

  • 提供一些HTML / JS文件
  • 公开我的Java Servlet支持的REST API

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目录消失。

1 个答案:

答案 0 :(得分:3)

我认为设置Web应用程序的XML片段看起来像这样:

<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>

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

在Linux系统上,你经常有一个cron作业,正在删除/ tmp中的旧条目,并注意#34;这些仍然是Jetty所需的重要目录导致了这些错误。 servlet仍然可以访问,因为它们是由类加载器加载的java类,因此删除最初加载它们的jar并不重要(当然,除了你尝试访问没有&#39;之前被访问过。)

对此的解决方案是自己指定java.io.tmpDir,指向您自己控制的目录。