一尘不染

使用ResourceUtils.getFile在Heroku环境中从类路径读取文件

spring-boot

我正在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.testjar:file:/app/target/myapp.jar!/com/myapp/myFile.test


阅读 606

收藏
2020-05-30

共1个答案

一尘不染

我怀疑当您在本地运行时,它是从爆炸的JAR文件(即,作为文件系统上的常规文件)拾取类路径上的文件。

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

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

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

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

2020-05-30