Java 动态加载jar中的getResourceAsStream
我知道关于Java的getResource/getResourceAsStream有几十个(如果不是几百个)问题,但我没有找到任何问题的答案 我使用以下命令动态加载JAR:(Java 动态加载jar中的getResourceAsStream,java,eclipse,jar,getresource,Java,Eclipse,Jar,Getresource,我知道关于Java的getResource/getResourceAsStream有几十个(如果不是几百个)问题,但我没有找到任何问题的答案 我使用以下命令动态加载JAR:(字符串路径已给定) 然后在jar中,我尝试在jar中加载一个资源。这个资源显然存在于jar中,如果我在Eclipse中使用类加载器运行整个过程,那么整个过程都可以工作。在罐子里它不工作$ getClass().getResourceAsStream("resource.dat"); 我尝试了/packageName/re
字符串路径已给定)
然后在jar中,我尝试在jar中加载一个资源。这个资源显然存在于jar中,如果我在Eclipse中使用类加载器运行整个过程,那么整个过程都可以工作。在罐子里它不工作$
getClass().getResourceAsStream("resource.dat");
我尝试了/packageName/resource.dat
、packageName/resource.dat
、/resource.dat
和resource.dat
的所有可能组合。它们都抛出一个流关闭
异常
我尝试过调试,最后打印了通过getClass().getResource(path)
这导致以下网址,它看起来不正常,我。它应该说“localhostC:…”吗
转换此URL还会引发异常(URISyntaxException
)
这个URL真的坏了吗?还是我做错了什么?尝试更改行:
URL url = new URL("file", "localhost", jar.getAbsolutePath());
到
URL构造函数中的主机参数在这种情况下不适用。首先,文件
类有一个方法,因此获取指向文件的URL的首选方法是:
URL url = new File(path).toURI().toURL();
因此,使用这个类加载器:
File jar = new File(path);
URLClassLoader loader = new URLClassLoader(new URL[] { jar.toURI().toURL() });
接下来,当您要为jar加载资源时,请使用源自jar的类,因此如果您已经加载了类c
:
Class<?> c = loader.loadClass(classPathAndName);
URL resource = c.getResource("data.txt");
或者,您可以使用ClassLoader
来获取以下资源:
loader.getResoure(packageAndResourceName);
但请注意,以下引用自:
此方法将首先在父类装入器中搜索资源;如果父级为null
,则搜索内置到虚拟机的类加载器的路径。如果失败,此方法将调用以查找资源
非常感谢。这很有效。仍然奇怪为什么它会在getResource标签中添加“localhost”代码>-classLoader.getResourceAsStream为jar中除/META-INF/MANIFEST.MF之外的所有条目返回null
File jar = new File(path);
URLClassLoader loader = new URLClassLoader(new URL[] { jar.toURI().toURL() });
Class<?> c = loader.loadClass(classPathAndName);
URL resource = c.getResource("data.txt");
jar:file:/C:/test/testjar.jar!/testpkg/data.txt
loader.getResoure(packageAndResourceName);