我知道有几十个(如果不是几百个)关于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.dat
,packageName/resource.dat
,/resource.dat
和resource.dat
的所有可能组合。他们都抛出stream closed
例外。
我尝试了调试,最后打印了通过getClass().getResource(path)
这导致了以下网址,这对我来说并不正常。是应该说“localhostC:......”?
jar:file://localhostC:\Users\******\export.jar!/packageName/resource.dat
转换此网址也会引发异常(URISyntaxException
)。
这个网址真的坏了还是我做错了什么?
答案 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)
来查找资源。