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

时间:2016-03-01 15:11:30

标签: java spring 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.test转换为jar:file:/app/target/myapp.jar!/com/myapp/myFile.test

1 个答案:

答案 0 :(得分:4)

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

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

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

然后你可以使用BufferedReader来准备线条。但也许ResourceUtils有更好的方法。

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