无法从Heroku Java应用程序中的类路径加载资源

时间:2018-04-27 18:19:56

标签: java maven heroku classpath

我在运行时访问资源文件时遇到问题,该文件存储在我的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"

根据我的理解,我应该匹配资源的正确路径!

你能指导我如何加载资源文件吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

<强>解决

我被Heroku的支持指向了这个问题。

问题在于我加载文件的方式,而不是我如何找到资源的路径。 具体来说,这一行:

Stream lines = Files.lines(Paths.get(ddlResourceFullPath));

Files.lines期望文件位于文件系统上,并且无法打开Jar文件中的文件。

使用java.lang.ClassLoader.getResourceAsStream()解决了这个问题。 (例如:MyClass.class.getResourceAsStream())