动态加载jar中的getResourceAsStream

时间:2014-10-28 18:22:12

标签: java eclipse jar getresource

我知道有几十个(如果不是几百个)关于Java的getResource / getResourceAsStream的问题,但我找不到任何问题的答案。

我动态加载jar :( String path已经给出)

File jar = new File(path);
URL url = new URL("file", "localhost", jar.getAbsolutePath());
URLClassLoader loader = new URLClassLoader(new URL[] { url });
c = loader.loadClass(name);

然后在jar中我尝试在jar中加载资源。这个资源显然存在于jar中,如果我只是在Eclipse中使用类加载器运行整个过程,整个过程就可以工作。在一个罐子里,它不起作用。$

getClass().getResourceAsStream("resource.dat"); 

我尝试了/packageName/resource.datpackageName/resource.dat/resource.datresource.dat的所有可能组合。他们都抛出stream closed例外。

我尝试了调试,最后打印了通过getClass().getResource(path)

加载的这些文件的网址

这导致了以下网址,这对我来说并不正常。是应该说“localhostC:......”?

jar:file://localhostC:\Users\******\export.jar!/packageName/resource.dat

转换此网址也会引发异常(URISyntaxException)。

这个网址真的坏了还是我做错了什么?

2 个答案:

答案 0 :(得分:2)

尝试更改行:

URL url = new URL("file", "localhost", jar.getAbsolutePath());

URL url = new URL("file", null, jar.getAbsolutePath());

在这种情况下,URL构造函数中的host参数不适用。

答案 1 :(得分:2)

首先,File类有一个toURI()方法,因此获取指向文件的URL的首选方法是:

URL url = new File(path).toURI().toURL();

所以使用它,类加载器:

File jar = new File(path);
URLClassLoader loader = new URLClassLoader(new URL[] { jar.toURI().toURL() });

接下来,当你想为jar加载一个资源时,使用一个来自jar的Class,所以如果你已经加载了Class c

Class<?> c = loader.loadClass(classPathAndName);
URL resource = c.getResource("data.txt");

这将导致类似:

jar:file:/C:/test/testjar.jar!/testpkg/data.txt

或者,您可以使用ClassLoader获取资源,如:

loader.getResoure(packageAndResourceName);

但请注意,这引自javadoc

  

此方法将首先在父类加载器中搜索资源;如果父级是null,则搜索内置到虚拟机的类加载器的路径。如果失败,此方法将调用findResource(String)来查找资源。