从依赖项中的应用程序类路径加载资源

时间:2018-01-25 13:23:58

标签: java classpath

基本上我有一个需要动态行为的客户端.jar。它需要从其父应用程序的类路径加载资源。主应用程序是Spring Boot应用程序,客户端.jar是该项目的maven依赖项。

我发现将test.xml存储在Spring Boot父项目的src / main / resources的子文件夹中,然后在依赖项中使用此代码:

InputStream fis = SSLSocketFactoryGenerator.class.getResourceAsStream("/subFolder/etc/test.xml");

将导致空指针,因为它找不到该文件。任何人都知道这是为什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可能有两种可能的情况来获得NPE:

1(最有可能)。你错误地组装了你的罐子,/subFolder/etc/test.xml根本不在类路径中。看看ClassLoader::getResource(String name)

public URL getResource(String name) {
    URL url;
    if (parent != null) {
        url = parent.getResource(name);
    } else {
        url = getBootstrapResource(name);
    }
    if (url == null) { //not found in ClassPath, falling back to findResource.
        url = findResource(name);
    }
    return url;
}

但是findResource的“默认”实现是:

protected URL findResource(String name) {
    return null;
}

所以我建议你检查一下装配好的jar文件。

2(非常不可能)。类SSLSocketFactoryGeneratorClassLoader加载,其中包含用于查找上面列出的资源的重写方法。实际上我无法想象我们会覆盖类路径中加载资源的行为,因此我们无法加载它们。所以1.很可能就是你的情况