Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态加载jar中的getResourceAsStream_Java_Eclipse_Jar_Getresource - Fatal编程技术网

Java 动态加载jar中的getResourceAsStream

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

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

我使用以下命令动态加载JAR:(
字符串路径已给定)

然后在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);