我知道关于Java的getResource/getResourceAsStream有几十个问题(如果不是几百个问题),但我没有找到解决问题的任何答案。
我用:动态加载jars (给出了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)加载的这些文件的URL
这导致了下面的URL,这在我看来并不正常。是不是应该说“localhostC:.”?
jar:file://localhostC:\Users\******\export.jar!/packageName/resource.dat转换此URL还会引发异常(URISyntaxException)。
这个URL真的坏了还是我做错了什么?
发布于 2014-10-28 18:36:57
试着改变线路:
URL url = new URL("file", "localhost", jar.getAbsolutePath());至
URL url = new URL("file", null, jar.getAbsolutePath());在这种情况下,URL构造函数中的主机参数不适用。
发布于 2014-10-28 18:42:35
首先,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)来查找资源。
https://stackoverflow.com/questions/26615687
复制相似问题