java - WAR 中的打包 JSON 文件未在 AWS 上获取
问题描述
我有一个 springboot 应用程序,它读取一堆 JSON 文件
src/main/资源/商店
使用此代码:
File(javaClass.getResource("/shops/").path).walkTopDown().forEach {
当我在本地运行它时,使用
干净启动运行
代码运行良好,我从解析这些文件的查询中得到结果。
但是,在构建 WAR 文件时
清洁建设战争
并将其部署到 AWS 的 EC2 实例,我没有得到任何结果,我认为这是因为文件没有被拾取。
我将 .war 重命名为 .zip 进行检查,但找不到 json 文件(除非它们已被重命名和移动)。如何确保文件在 WAR 中正确打包?
编辑:现在已经确认问题是服务器部署的 WAR 没有读取任何文件,而本地运行实例是。
解决方案
当您运行时bootRun
,它会/shop
在 下找到build/classes
,因此path
会为您提供本地文件系统路径,该路径自然适用于File
. 但是,当打包在 WAR 文件中时,在 WARpath
中找到的资源的 不再是有效的文件系统路径。它将使用 WAR 文件的路径以及 WAR 内资源的路径进行编码。
为了使它工作,而不是File
,使用javaClass.getResourceAsStream("/shop/somefile.json")
并从InputStream
返回的读取。
您的下一个问题将是File
您可以遍历目录树并自动获取/shop/
. 现在你不能,因为没有文件系统目录可以遍历。您需要使用其中一个库在类路径上查找通配符资源。例如,Spring 允许您加载所有匹配的资源/shop/**/*.json
。
推荐阅读
- javascript - Javascript TypeError:无法读取未定义的属性“查找”
- javascript - Firebase 动态链接在 iOS 14 上的 Safari 中留下空白页面
- node.js - 为什么我只能运行全局安装的包?
- kubernetes - 使用 Docker 驱动程序启动 Minikube 并将其绑定到主机网络
- gitlab - Gitlab 管道中的 Datadog 日志记录
- oracle - 通过 oracle 制作 PL/SQL 块时,是否可以创建一个表,然后在同一个块中修改该表?
- java - R.java 和资源有什么区别?
- vim - vi是否支持“确认退出”
- ios - 如何将此转换后的 UIImage 上传到 Firebase 存储?
- python - 从 Cognito 获取 ClientID 的最佳方法