如何从java应用程序中加载的jar文件中加载资源?

如何从java应用程序中加载的jar文件中加载资源?,java,Java,因此,我有一个主应用程序,它应该加载一个包含代码和其他资源(即:jar文件、文本文件、java属性等)的jar。我使用: 这就是我如何尝试获取使用BufferedReader和InputStreamReader解析的包,以获取包中每个资源的名称。 好吧,可能有点太详细了(这只是我使用getResourceAsStream方法的一种方式),但我希望我能让自己明白,ContextClassLoader不包含我在运行这个jar的应用程序中加载的资源,所以我需要做什么才能从加载的jar中获取这些资源呢

因此,我有一个主应用程序,它应该加载一个包含代码和其他资源(即:jar文件、文本文件、java属性等)的jar。我使用:

这就是我如何尝试获取使用
BufferedReader
InputStreamReader
解析的包,以获取包中每个资源的名称。 好吧,可能有点太详细了(这只是我使用
getResourceAsStream
方法的一种方式),但我希望我能让自己明白,
ContextClassLoader
不包含我在运行这个jar的应用程序中加载的资源,所以我需要做什么才能从加载的jar中获取这些资源呢

编辑:调用
getResourceAsStream
方法:

private static List<String> getResourceFiles(String path) throws IOException {
    List<String> filenames = new ArrayList<>();

    try (
            InputStream in = getResourceAsStream(path);
            BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
        String resource;

        while ((resource = br.readLine()) != null) {
            filenames.add(resource);
        }
    }

    return filenames;
}

你为什么要这么做?为什么不将URL添加到URLClassLoader的JAR中呢

例如

此外,您可能还应该使URLClassLoader将您当前的类加载器作为父类,例如

URLClassLoader loader = new URLClassLoader(new File(jar).toURI().toURL(), Thread.currentThread().getContextClassLoader());

因为我在你发布的代码中没有看到任何对getResourceAsStream的调用,所以我不能确定罪魁祸首是什么。也许你只是提供了一个资源的坏名字。你能展示一下真正调用getResourceAsStream的代码吗?这是一个很好的开端,我将在一秒钟内对其进行总结,并编辑帖子。我怀疑我调用了错误的资源,因为我尝试在主应用程序中获取该文件,它与ContextLoader一起工作。那么/foo/bar/foobar是什么?看起来您希望它是一个包含文件名的文本文件或类似的文件,但它实际上是一个文件夹吗?我不希望它是一个文件,它实际上是一个包/文件夹,代码应该从中提取一个文件名列表。
private static InputStream getResourceAsStream(String resource) {       
        try {       
            return Thread.currentThread().getContextClassLoader().getResource(resource).openStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
private static List<String> getResourceFiles(String path) throws IOException {
    List<String> filenames = new ArrayList<>();

    try (
            InputStream in = getResourceAsStream(path);
            BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
        String resource;

        while ((resource = br.readLine()) != null) {
            filenames.add(resource);
        }
    }

    return filenames;
}
List<String> names = Foo.getResourceFiles("/foo/bar/foobar");
URLClassLoader loader = new URLClassLoader(new File(jar).toURI().toURL());
URLClassLoader loader = new URLClassLoader(new File(jar).toURI().toURL(), Thread.currentThread().getContextClassLoader());