Java 正在从应用程序引擎模块中读取文件
我正在尝试从位于WEB-INF目录中的应用程序引擎模块中读取静态文件Java 正在从应用程序引擎模块中读取文件,java,google-app-engine,maven,Java,Google App Engine,Maven,我正在尝试从位于WEB-INF目录中的应用程序引擎模块中读取静态文件 ... File file = new File("WEB-INF/somestaticfile.ext); ... 它在云环境中完美地工作,然而,在development server中,它以FileNotFoundException结束 我在maven的帮助下构建并运行该应用程序,似乎还需要在项目的EAR层次结构中预先设置一个表示模块的目录,以便找到该文件 ... File file = new File("module
...
File file = new File("WEB-INF/somestaticfile.ext);
...
它在云环境中完美地工作,然而,在development server中,它以FileNotFoundException
结束
我在maven的帮助下构建并运行该应用程序,似乎还需要在项目的EAR层次结构中预先设置一个表示模块的目录,以便找到该文件
...
File file = new File("modulename.war/WEB-INF/somestaticfile.ext);
...
这适用于本地开发服务器,但不适用于云环境
我相信有一种方法可以读取在云和本地环境下都能工作的文件。如有任何建议,将不胜感激 谷歌开发者文档始终是一个优秀的资源:
希望这有助于提供一个总体观点。如果您找到了问题的具体解决方案并可以在此处共享,请执行 我花了一些时间来解决这个问题,下面是我找到的解决方案。若您将资源放在类路径上,那个么您可以从云和本地开发服务器访问它们,如下所示
getClass().getClassLoader().getResource("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
方法,但您会被屏蔽
如果您不使用Spring,那么基于ServletContext
实现您自己的资源抽象应该不是什么大事
如果有人能提供其他解决方案,请随时提供 我知道应用程序引擎处理静态文件和资源文件的方式,正如您引用的文档所述,WEB-INF目录中的文件始终作为资源文件提供给应用程序。我需要的是在云和本地开发环境中访问此类文件的统一方法。您提到的路径模式仅适用于资源文件配置元素,而不是作为一种通过JavaAPI指定文件路径的方式。完全有意义。将内容放在那里,以防其他人希望在开发人员页面之外找到它。也就是说,如果你找到了一个具体的解决方案,请分享,因为我非常感兴趣!我正在开发AppEngine应用程序,并在本周末利用Maven与您的应用程序具有相似的特性!
getClass().getClassLoader().getResourceAsStream("resourceName");