使用ResourceUtils.getFile从Heroku环境中的类路径读取文件
我在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.test
到jar:file:/app/target/myapp.jar!/com/myapp/myFile.test
我怀疑,当你是在本地运行,它是从拿起文件类路径的路径分解JAR文件(即作为文件系统上的常规文件)。
在Heroku上,它是在JAR文件,这意味着它不是一个普通的文件,而且必须被理解为一个输入流,这可能是这样的:
ClassLoader cl = this.getClass().getClassLoader();
InputStream inputStream = cl.getResourceAsStream(pathToMyFile);
然后你可以使用一个BufferedReader准备行。但也许ResourceUtils
有一个更好的方法。
您可以通过运行Procfile
中的相同命令在本地重现此问题。
是的,你是对的。我最终使用'ResourceUtils.getURL()。openStream()' – jfcorugedo
您无法将其作为文件读取,您必须像在InputStream中那样读取它。 “文件”必须是系统上的实际资源(在使用它来读取或写入时)。这也是错误告诉你的。 –
是的,你是对的。我结束了使用'ResourceUtils.getURL()。openStream()' – jfcorugedo