簡體   English   中英

從App Engine模塊中讀取文件

[英]Reading a file from within App Engine module

我正在嘗試從位於WEB-INF目錄內的App Engine模塊內讀取靜態文件。

...
File file = new File("WEB-INF/somestaticfile.ext);
...

它完美地在雲環境中工作,但是在開發服務器中,它最終帶有FileNotFoundException

我借助Maven來構建和運行該應用程序,似乎還需要在目錄中添加一個代表項目EAR層次結構內模塊的目錄,以便可以找到該文件。

...
File file = new File("modulename.war/WEB-INF/somestaticfile.ext);
...

這適用於本地開發服務器,但不適用於雲環境。

我相信,有一種方法可以讀取在雲和本地環境中都可以使用的文件。 任何意見,將不勝感激。

我花了一些時間弄清楚了,這里是我找到的解決方案。 如果將資源放在類路徑中,則可以從雲和本地開發服務器按以下方式訪問它們。

getClass().getClassLoader().getResource("resourceName");

要么

getClass().getClassLoader().getResourceAsStream("resourceName");

但是,如果您的資源位於其他地方(例如WEB-INF),則我發現的唯一方法是使用javax.servlet.ServletContext#getResource(String)javax.servlet.ServletContext#getResourceAsStream(String)在兩種環境中。 如果您從應用程序的Web層訪問資源,但是如果需要從其他層(例如,服務層)訪問資源,則此解決方案是完全可以的,將Java Servlet API的依賴項引入該層可能不是一個好主意。

自從我使用Spring以來,我決定通過org.springframework.core.io.ResourceLoader#getResource(String)加載資源,該資源返回資源抽象,其具體實現取決於應用程序上下文類型和資源路徑前綴。 對於在Web容器中運行的應用程序,實際的實現在ServletContext使用ServletContext方法,但是您可以避免使用它。

如果您不使用Spring,那么基於ServletContext實現您自己的資源抽象應該沒什么大不了的。

如果有人可以提供其他解決方案,請隨時提供。

一如既往,Google開發人員文檔是一種極好的資源:

就是說,為了將來幫助他人,我將總結一些我認為通常與該問題相關的相關觀點(因為我看不到您的特定環境正在發生什么)。

App Engine提供來自專用服務器的靜態文件以及與應用程序服務器分開的緩存。 應用程序代碼使用文件系統可訪問的文件稱為資源文件。 這些文件與應用程序一起存儲在應用程序服務器上。

默認情況下,WAR中的所有文件都被視為靜態文件和資源文件,但JSP文件除外,JSP文件被編譯為servlet類並映射到URL路徑,而WEB-INF /目錄中的文件則永遠不用作文件。靜態文件,並且始終可作為資源文件供應用程序使用。 您可以使用appengine-web.xml文件中的元素調整將哪些文件視為靜態文件,將哪些文件視為資源文件。 元素指定與文件路徑匹配的模式,以覆蓋或排除靜態文件列表,以覆蓋或修改默認行為。 同樣,元素指定將哪些文件視為資源文件。

您提到開發服務器與部署之間似乎存在脫節。 在不深入研究Maven的情況下,我的第一個想法就是研究路徑模式。 正如他們在Google Developers文檔中所指出的那樣,路徑模式是使用零或多個and元素指定的。 在模式中,*表示文件或目錄名稱中任何字符的零個或多個,而**表示路徑中零個或多個目錄。 將應用程序部署到App Engine時,不會上傳文件和目錄匹配模式。 但是,當在本地Development Server上運行時,您的應用程序仍然可以訪問這些文件和目錄。 元素將覆蓋包括所有文件的默認行為。 元素適用於所有模式(如果未提供顯式,則為默認值)。

希望能幫助提供一個普遍的觀點。 如果您找到該問題的特定解決方案並可以在此處共享,請執行!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM