我在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
答案 0 :(得分:4)
我怀疑当你在本地运行时,它会从分解的JAR文件中获取类路径上的文件(即作为文件系统上的常规文件)。
在Heroku上,它位于JAR文件中,这意味着它不是常规文件,必须作为输入流读取,可能如下所示:
ClassLoader cl = this.getClass().getClassLoader();
InputStream inputStream = cl.getResourceAsStream(pathToMyFile);
然后你可以使用BufferedReader来准备线条。但也许ResourceUtils
有更好的方法。
您可以通过运行Procfile
中的相同命令在本地重现问题。