嵌入式 Jetty 停止提供静态内容
Embedded Jetty stops serving static content
我有一个嵌入式 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 目录消失的事情。
我假设您的 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
你自己指定,指向你自己控制的目录。
我有一个嵌入式 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 目录消失的事情。
我假设您的 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
你自己指定,指向你自己控制的目录。