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().readValuejavaClass.getResourceAsStream("/shop/*.json")
行不通。没有通过通配符自动发现资源的核心 Java API。你需要搜索一个库来做到这一点。如果您已经在您的应用程序中使用 Spring,那么您可以按照我在答案中提到的那样使用 Spring 的资源加载。
当你提到Spring资源加载时,我将其标记为我的答案,但我实际上没有使用流方法,我使用了resourceLoader.getResource("classpath:/shops.json")跨度>
以上是关于WAR 中的打包 JSON 文件未在 AWS 上获取的主要内容,如果未能解决你的问题,请参考以下文章
AWS Java - 未找到包含在我的 .War 包中的参考文件