2016-03-01 88 views
1

我在Heroku中运行Spring Boot应用程序,使用Maven来管理构建生命周期。使用ResourceUtils.getFile从Heroku环境中的类路径读取文件

在我的应用程序的初始化阶段,我想读取打包到我的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,我已经检查过该文件只是它应该是(在里面罐)。

此外,根据错误跟踪,春节所在的文件,因为它变换从classpath:com/myapp/myFile.testjar:file:/app/target/myapp.jar!/com/myapp/myFile.test

+2

您无法将其作为文件读取,您必须像在InputStream中那样读取它。 “文件”必须是系统上的实际资源(在使用它来读取或写入时)。这也是错误告诉你的。 –

+0

是的,你是对的。我结束了使用'ResourceUtils.getURL()。openStream()' – jfcorugedo

回答

2

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

在Heroku上,它是在JAR文件,这意味着它不是一个普通的文件,而且必须被理解为一个输入流,这可能是这样的:

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

然后你可以使用一个BufferedReader准备行。但也许ResourceUtils有一个更好的方法。

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

+1

是的,你是对的。我最终使用'ResourceUtils.getURL()。openStream()' – jfcorugedo

相关问题