2017-07-10 89 views
0

我正在使用Maven和Tomcat進行一個小型RESTFul項目。在我的實現中,我必須讀取一個txt文件。 目前我正在測試Eclipse中的實現。當使用絕對路徑時,我可以毫無問題地執行我的代碼。由於我必須生成一個war文件,因此我需要在其中封裝txt文件。使用Maven和在WAR中讀取文件

<build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.6</version> 
      <configuration> 
       <warSourceDirectory>WebContent</warSourceDirectory> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

我的war文件包含存儲在最高級別的txt文件。你有什麼建議從war文件裏讀取txt文件?我在這裏發現了幾個線程,但所有嘗試都失敗了。我需要一個規範,可以在Eclipse中測試時直接在Tomcat中執行時讀取文件。

由於沒有找到文本文件,所以在Eclipse中執行實現時,此代碼不起作用。該文件位於WebContent文件夾中,在生成快照/戰爭後,您可以在war文件中找到該文件。

  InputStreamFactory isf = new InputStreamFactory() { 
      public InputStream createInputStream() throws IOException { 
       return new FileInputStream("/text_de.txt"); 
      } 
     }; 

我也試過在Eclipse執行實施時無需訪問(我知道,在執行戰爭文件時,會導致錯誤)以下:

return new FileInputStream("/WebContent/text_de.txt"); 

UPDATE:

現在我可以在Eclipse中執行成功的實現。我先用註解@Resource試過,但改爲@context

@Context 
ServletContext servletContext; 

然後,我添加此行:

String fileLocation = System.getProperty("com.example.resourceLocation",servletContext.getRealPath("/text_de.txt")); 

感謝

回答

2

我不知道如果這能幫助你如此,但你可以使用HttpServletRequest request從您的doGet()(的doPost(),或他人的一個),嘗試:

return new FileInputStream(request.getServletContext().getRealPath("/text_de.txt")); 

如果使用解壓縮程序解壓縮.war文件,則可以確定所需的路徑,如果「/text_de.txt」可能不正確,但很多時候/ WebContent /的內容最終位於.war文件...

希望這有助於,

注:HttpServletRequest的它自身具有相同名稱的方法,而是一個已被棄用,這樣你就會知道它的錯誤之一。

在評論中討論後:

在開發過程中需要一個不同的位置,

找到文件:tomcat的/ conf目錄/,實際上是運行Tomcat實例的catalina.properties。我不知道如果Eclipse運行這個,或者你點Eclipse來了tomcat-home文件夾

添加一行com.example.resourceLocation=/full/path/to/eclipse/project/text_de.txt

比使用類似:

String fileLocation = System.getProperty(
    "com.example.resourceLocation", 
    request.getServletContext().getRealPath("/text_de.txt")); 
    //this second parameter is a default value you can provide yourself 
    //if the property does not exists it chooses the second as return value  

響應非-servlet問題:

我用的球衣link,這裏我用這樣的

@Context 
private HttpServletRequest httpRequest; 

@GET 
@Path("file") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getFile() { 
    String fileLocation = System.getProperty(
     "com.example.resourceLocation", 
     this.httpRequest.getServletContext().getRealPath("/text_de.txt")); 
     //this second parameter is a default value you can provide yourself 
     //if the property does not exists it chooses the second as return value 

    // do something with fileLocation 
    FileInputStream fi = new FileInputStream(fileLocation); 
    return Response.status(Response.Status.OK) 
       .entity("body") 
       .build(); 
} 

其中響應@POST或@GET等功能位於

幾年前在我使用了Servlet過濾器SOAP服務和來自的doFilter()函數檢索請求對象類中,

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     this.context = request.getServletContext(); 

Eclipse可以創建一個使用項目的上下文菜單中的過濾器...

在這兩種情況下,你有ServletRequest對象或ServletContext對象,所以你可以它放到該文件讀取位置解決方案

親切的問候

+0

由於我的maven規範,/ WebContent /的內容最終在.war文件的根目錄中。我只是想能夠在Eclipse中執行實現(啓動Tomcat,將Project添加爲Eclipse中的服務器資源)以及.war文件。 – Matzka

+0

也許我誤解了,你的意思是你需要從eclipse中的位置讀取文件嗎? 這可能會像「/Users/user/workspace/project/WebContent/text.txt」 比你可以在你的開發機器上使用系統屬性來覆蓋默認的生產環境... – mzijdemans

+0

我正在開發服務在Eclipse中。戰爭文件將被集成到另一個Tomcat實例中。我需要一種讀取txt文件的方式,該文件在Eclipse中執行服務時用於測試pruposes以及在生產系統中執行.war文件時工作。在Eclipse中執行程序時,不會觸及.war文件。重寫讀取操作可能聽起來像是個好主意。 – Matzka