我在运行时访问资源文件时遇到问题,该文件存储在我的JAVA项目的resources文件夹中。
该项目基于Spring Boot,我在src / main / resources下存储了一些ddl和json配置文件。 项目正确部署(通过Maven)。但是,当我的代码尝试访问其中一个资源文件时,我得到以下异常:
java.nio.file.NoSuchFileException:file:/app/target/app-backend-0.0.1-SNAPSHOT.jar!/ BOOT-INF / classes!/setup_data/app_data_schema.ddl
我可以从日志中看到,在此异常之前,另一个文件被Spring从同一位置加载了 (文件:/app/target/app-backend-0.0.1-SNAPSHOT.jar / BOOT-INF / classes中/setup_data/schema.sql!)。
我还使用heroku CLI(" heroku run bash")进行了双重检查,确实已将文件部署到我期望的位置:
/应用程序/目标/类/ setup_data
- test_app_data1.json
- test_app_data2.json
- app_data_schema.ddl
这让我相信问题出在我加载文件的方式上,这些文件在我的机器上本地工作,但在部署到Heroku时却没有。 这是我用来计算文件完整路径的代码:
public static String getFullPathForResource(Class<?> resourceClass, String resourceName) {
URL resourceUrl = resourceClass.getResource(resourceName);
String fullPath = "";
if (resourceUrl != null) {
fullPath = resourceUrl.getPath();
}
return fullPath;
}
然后按如下方式加载文件:
String ddlResourceFullPath = getFullPathForResource(getClass(), ddlResource);
Stream<String> lines = Files.lines(Paths.get(ddlResourceFullPath));
getFullPathForResource()方法的结果确实如下: &#34;文件:/app/target/app-backend-0.0.1-SNAPSHOT.jar / BOOT-INF /类/schema.sql"
!根据我的理解,我应该匹配资源的正确路径!
你能指导我如何加载资源文件吗?
感谢您的帮助!
答案 0 :(得分:0)
<强>解决强>
我被Heroku的支持指向了这个问题。
问题在于我加载文件的方式,而不是我如何找到资源的路径。 具体来说,这一行:
Stream lines = Files.lines(Paths.get(ddlResourceFullPath));
Files.lines期望文件位于文件系统上,并且无法打开Jar文件中的文件。
使用java.lang.ClassLoader.getResourceAsStream()解决了这个问题。 (例如:MyClass.class.getResourceAsStream())