WAR 中的打包 JSON 文件未在 AWS 上获取

Posted

技术标签:

【中文标题】WAR 中的打包 JSON 文件未在 AWS 上获取【英文标题】:Packaged JSON file in WAR not picked up on AWS 【发布时间】:2018-10-13 11:54:12 【问题描述】:

我有一个 springboot 应用程序,它在

中读取一堆 JSON 文件

src/main/resources/shops

使用此代码:

File(javaClass.getResource("/shops/").path).walkTopDown().forEach 

当我在本地运行时,使用

干净启动运行

代码运行良好,我从解析这些文件的查询中得到结果。

但是在使用

构建 WAR 文件时

干净的构建战争

并将其部署到 AWS 的 EC2 实例,我没有得到任何结果,我认为这是因为文件没有被拾取。

我将 .war 重命名为 .zip 来检查它,但我找不到 json 文件(除非它们已被重命名和移动)。如何确保文件在 WAR 中正确打包?

编辑:现在已经确认问题是服务器部署的 WAR 没有读取任何文件,而本地运行实例是。

【问题讨论】:

你使用 Maven 还是 Gradle?你能发布你的构建脚本吗? @dunni gradle. 【参考方案1】:

当您运行bootRun 时,它会在build/classes 下找到/shop,因此path 会为您提供本地文件系统路径,这自然适用于File。但是,当打包在 WAR 文件中时,在 WAR 中找到的资源的 path 不再是有效的文件系统路径。它将使用 WAR 文件的路径以及 WAR 内部资源的路径进行编码。

要使其正常工作,请使用javaClass.getResourceAsStream("/shop/somefile.json") 并从返回的InputStream 中读取,而不是File

您的下一个问题将是使用File,您可以遍历目录树并自动获取/shop/ 下的所有json 文件。现在你不能因为没有文件系统目录可以遍历。您需要使用其中一个库在类路径上查找通配符资源。例如,Spring 允许您加载与 /shop/**/*.json 匹配的所有资源。

【讨论】:

谢谢!这真的很有帮助。我确实尝试了流选项,但正如您所说,无法获得目录列表。你是说 javaClass.getResourceAsStream("/shop/*.json") 应该工作吗?然后我要做的是 jacksonObjectMapper().readValue(it.absoluteFile, Shop::class.java) 所以我需要以某种方式将 IS 映射到 Object 好吧,javaClass.getResourceAsStream("/shop/*.json") 行不通。没有通过通配符自动发现资源的核心 Java API。你需要搜索一个库来做到这一点。如果您已经在您的应用程序中使用 Spring,那么您可以按照我在答案中提到的那样使用 Spring 的资源加载。 当你提到Spring资源加载时,我将其标记为我的答案,但我实际上没有使用流方法,我使用了resourceLoader.getResource("classpath:/shops.json")跨度>

以上是关于WAR 中的打包 JSON 文件未在 AWS 上获取的主要内容,如果未能解决你的问题,请参考以下文章

AWS Java - 未找到包含在我的 .War 包中的参考文件

如何从打包在war文件中的jar文件中加载资源? [复制]

读取 aws lambda 包中的打包文件

如何在gradle构建文件中将哪个依赖项和依赖项版本打包到war文件中?

读取aws lambda包中的打包文件

将java web项目打包war文件然后发布到Tomcat,