【问题标题】:Using ResourceUtils.getFile to read a file from classpath in Heroku environment在 Heroku 环境中使用 ResourceUtils.getFile 从类路径中读取文件
【发布时间】:2016-06-14 01:59:18
【问题描述】:

我在 Heroku 中运行 Spring Boot 应用程序,使用 Maven 管理构建生命周期。

在我的应用程序的初始化阶段,我想读取一个打包到我的 JAR 文件中的文件。

为了设法获取文件的内容,我使用 Spring 实用程序类 ResourceUtils,并使用特殊前缀 classpath: 表示文件的路径。

我使用的代码如下所示:

String pathToMyFile = "classpath:com/myapp/myFile.test"
List<String> fileLines = Files.readLines(ResourceUtils.getFile(pathToMyFile), IOConstants.DEFAULT_CHARSET_TYPE);

当我在本地机器上执行应用程序时,此代码按预期工作。

但是当我将应用程序推送到 Heroku 时,我收到以下错误:

Caused by: java.io.FileNotFoundException: class path resource [com/myapp/myFile.test] 
cannot be resolved to absolute file path because it does not reside in the 
file system: jar:file:/app/target/myapp.jar!/com/myapp/myFile.test 

我运行了heroku run bash 并检查了文件是否就在它应该在的位置(在 jar 内)。

此外,根据错误跟踪,Spring 定位文件,因为它将路径从classpath:com/myapp/myFile.test 转换为jar:file:/app/target/myapp.jar!/com/myapp/myFile.test

【问题讨论】:

  • 您不能将其作为文件读取,您必须像在InputStream 中那样读取它。 File 必须是系统上的实际资源(使用它进行读取或写入时)。这也是错误告诉你的。
  • 是的,你是对的。我最终使用了ResourceUtils.getURL().openStream()
  • 您可能想使用 Guava 的 Resources.toString(Resources.getResource(pathToMyFile), Charset.forName("UTF-8")) 从您的应用程序 jar 中读取文件。

标签: java spring heroku spring-boot


【解决方案1】:

我怀疑当你在本地运行时,它会从一个分解的 JAR 文件(即作为文件系统上的常规文件)获取类路径上的文件。

在 Heroku 上,它位于 JAR 文件中,这意味着它不是常规文件,必须作为输入流读取,可能如下所示:

ClassLoader cl = this.getClass().getClassLoader();
InputStream inputStream = cl.getResourceAsStream(pathToMyFile);

然后您可以使用BufferedReader 来读取这些行。但也许ResourceUtils 有更好的方法。

您可能可以通过运行与Profile 中相同的命令在本地重现该问题。

【讨论】:

  • 是的,你是对的。我最终使用了ResourceUtils.getURL().openStream()
猜你喜欢
  • 2023-04-05
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2017-03-06
  • 2023-03-24
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多