2017-09-04 95 views
0

我有一個嵌入式的Jetty應用程序,其中碼頭將提供兩件事情:嵌入式碼頭停止提供靜態內容

  • 服務的一些HTML/JS文件
  • 露出了REST API,我的Java Servlet是支持

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目錄消失的事情。

回答

3

我假設你的XML片段設置Web應用程序看起來是這樣的:

<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中的舊條目,以「照顧」Jetty所需的這些仍然重要的目錄,從而導致這些錯誤。 servlet仍然可以訪問,因爲它們是由類加載器加載的java類,因此刪除它們最初加載的jar文件並不重要(當然,除非您嘗試訪問之前未訪問過的servlet )。

解決方法是自己指定java.io.tmpDir,指向您自己控制下的目錄。

+0

沒有XML代碼,但我以編程方式完成相同的設置。 你的建議非常有意義。不幸的是,這個應用程序將被部署到很多環境(Windows,RaspPi Linux,Amazon EC2 Linux等),每個環境都有自己的怪癖。有什麼我可以設定的臨時目標,將在任何地方工作? 非常感謝您的幫助。 (快捷!) –

+1

@Sander我們在應用程序中使用碼頭所以我們安裝的控制和設置'java.io.tmpDir'因此,以確保問題不再發生。一個簡短的谷歌搜索出現了https://stackoverflow.com/questions/19232182/jetty-starts-in-c-temp/19232771#19232771也許這有助於你的 – Lothar

+0

@SanderSmith另外,你可以嘗試設置'extractWAR'爲'false'(保持'copyWebInf'爲'true',否則如果Jetty還沒有修復這個問題,那麼你的servlet很可能不再工作了。這應該將靜態內容保留在文件系統之外。但我在練習中沒有嘗試過,所以這只是一個猜測。 – Lothar