如何在部署到 Elastic Beanstalk 的 Spring Boot 项目中找到资源文件?

Posted

技术标签:

【中文标题】如何在部署到 Elastic Beanstalk 的 Spring Boot 项目中找到资源文件?【英文标题】:How do I locate resource files in a Spring Boot project deployed to Elastic Beanstalk? 【发布时间】:2020-01-06 19:38:11 【问题描述】:

我的 Spring Boot 项目在 src/main/resources 文件夹中包含一个 XML 文件,这是此类文件的常用位置。

在本地和 Pivotal CloudFoundary 上运行,我能够找到文件并将其读入,但在 Beanstalk 上,该过程会导致一个空文件。

定位和读取文件的代码:

URL url = getClass().getResource("/myFile.xml");
LOG.info("File location: " + url.toString());

生成的日志条目:

File location: jar:file:/var/app/current/application.jar!/WEB-INF/classes!/myFile.xml

当我通过 SSH 连接到 EC2 实例时,我可以在指定目录中找到该 jar。

我是否需要配置 Maven 才能将此文件移动到某处?

更新

我已经意识到我需要像在 InputStream 中一样对待这个文件,因为它被打包在 jar 中。

我现在使用以下代码,导致以下错误:

FileUtils.copyInputStreamToFile(new ClassPathResource("myFile.xml").getInputStream(), myFile);

java.lang.NullPointerException: null
at org.apache.commons.io.FileUtils.openOutputStream(FileUtils.java:345) ~[commons-io-2.5.jar:2.5]

FileUtils.copyInputStreamToFile(new ClassPathResource("classpath:myFile.xml").getInputStream(), myFile);


java.io.FileNotFoundException: class path resource [classpath:myFile.xml] cannot be opened because it does not exist

谢谢!

【问题讨论】:

【参考方案1】:

你的 pom.xml 是什么样子的?也许有一个资源过滤器处于活动状态? 在 Spring 应用程序中,您可以使用 File file = ResourceUtils.getFile("classpath:myFile.xml"); 来读取资源文件。

你能用ResourceUtils检查结果吗?

这里是 api 文档的链接: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/ResourceUtils.html#getFile-java.lang.String-

【讨论】:

以上是关于如何在部署到 Elastic Beanstalk 的 Spring Boot 项目中找到资源文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TFS 2017 部署到 Elastic Beanstalk?

部署到 Elastic Beanstalk 时如何安装 Go 依赖项?

如何在部署到 Elastic Beanstalk 的 Spring Boot 项目中找到资源文件?

如何以编程方式获取部署到 Elastic Beanstalk 环境的应用程序版本

如何将 NodeJS 部署自定义到 Elastic Beanstalk?

如何在 nitrous io 盒上配置 git 以部署到 AWS Elastic Beanstalk?