java - 从 App Engine 模块内读取文件

标签 java google-app-engine maven

我正在尝试从放置在 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 方法,但您不受其影响。

如果你不使用Spring,基于ServletContext实现自己的资源抽象应该没什么大不了的。

如果有人可以提供其他解决方案,请随意这样做。

关于java - 从 App Engine 模块内读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873574/

相关文章:

java - 尝试从命令行运行 Maven 项目时出错

java - Maven:pom编译后添加了不同版本的slf4 jar,war因此出现版本冲突错误

java - 创建子 Fragment 后从 Activity 获取子 Fragment

java - 当我进行分析时内存的奇怪行为

docker - 在 Google App Engine 上运行 gcsfuse 时出现问题

java - 如何在Servlet中插入JSP功能?

maven - 使用 Inno Setup 和 maven 创建 native javafx 应用程序

eclipse - Maven Eclipse 多模块阴影依赖

java - 覆盖 Play 1.2.4 中现有的 CRUD 模块

java - 如何在 App Engine 应用程序中处理/_ah/bounce 端点通知