Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在从应用程序引擎模块中读取文件_Java_Google App Engine_Maven - Fatal编程技术网

Java 正在从应用程序引擎模块中读取文件

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

我正在尝试从位于WEB-INF目录中的应用程序引擎模块中读取静态文件

...
File file = new File("WEB-INF/somestaticfile.ext);
...
它在云环境中完美地工作,然而,在development server中,它以
FileNotFoundException
结束

我在maven的帮助下构建并运行该应用程序,似乎还需要在项目的EAR层次结构中预先设置一个表示模块的目录,以便找到该文件

...
File file = new File("modulename.war/WEB-INF/somestaticfile.ext);
...
这适用于本地开发服务器,但不适用于云环境


我相信有一种方法可以读取在云和本地环境下都能工作的文件。如有任何建议,将不胜感激

谷歌开发者文档始终是一个优秀的资源:

也就是说,为了将来帮助其他人,我将总结一些我认为通常与这个问题相关的要点(因为我看不出在您的特定环境中发生了什么)

App Engine提供来自专用服务器的静态文件以及与应用服务器分离的缓存。应用程序代码可以使用文件系统访问的文件称为资源文件。这些文件与应用程序一起存储在应用程序服务器上

默认情况下,WAR中的所有文件都被视为静态文件和资源文件,但JSP文件除外,JSP文件被编译成servlet类并映射到URL路径,WEB-INF/目录中的文件从不作为静态文件使用,并且始终作为资源文件供应用程序使用。可以使用appengine-web.xml文件中的元素调整哪些文件被视为静态文件,哪些文件被视为资源文件。元素指定与静态文件列表中包含和排除的文件路径相匹配的模式,覆盖或修改默认行为。类似地,元素指定哪些文件被视为资源文件

您提到开发服务器和部署之间似乎存在断开连接。在不深入Maven的情况下,我的第一个想法是查看路径模式。正如他们在googledevelopers文档中所指出的,路径模式是使用零个或多个and元素指定的。在模式中,*表示文件或目录名中任何字符的零个或多个,**表示路径中的零个或多个目录。将应用部署到应用引擎时,将不会上载与模式匹配的文件和目录。但是,当您的应用程序在本地开发服务器上运行时,仍然可以访问这些文件和目录。元素覆盖包含所有文件的默认行为。元素在所有模式之后应用(如果未提供显式,则为默认值)


希望这有助于提供一个总体观点。如果您找到了问题的具体解决方案并可以在此处共享,请执行

我花了一些时间来解决这个问题,下面是我找到的解决方案。若您将资源放在类路径上,那个么您可以从云和本地开发服务器访问它们,如下所示

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");