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