Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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读取文件_Java_Dynamic_External_Urlclassloader - Fatal编程技术网

Java从动态外部jar读取文件

Java从动态外部jar读取文件,java,dynamic,external,urlclassloader,Java,Dynamic,External,Urlclassloader,我正在尝试做的,并且已经研究了很多天如何做的是有一个母罐子,它可以查看一个文件夹并动态加载所有的罐子(其实不需要知道它们),为了让它工作,我需要插件中的一个名为plugin的文件。我目前有一个工作类加载器,可以启动插件,但我无法读取插件文件 这是我目前的代码: 负载类 错误是(第44行:in=新缓冲…) 使用获取插件文件的URL,然后在其上打开输入流 编辑:您必须使用一个使用您创建的URL类加载器加载的类来执行此操作-而不是原始示例中的类加载器的类加载器--该类只查看父类加载器的类路径,而不是

我正在尝试做的,并且已经研究了很多天如何做的是有一个母罐子,它可以查看一个文件夹并动态加载所有的罐子(其实不需要知道它们),为了让它工作,我需要插件中的一个名为
plugin
的文件。我目前有一个工作类加载器,可以启动插件,但我无法读取
插件
文件

这是我目前的代码: 负载类

错误是(第44行:in=新缓冲…)


使用获取插件文件的URL,然后在其上打开输入流

编辑:您必须使用一个使用您创建的URL类加载器加载的类来执行此操作-而不是原始示例中的类加载器的类加载器--该类只查看父类加载器的类路径,而不是您刚刚创建的类路径

此代码应适用于:

Class c = ClazzL.loadClass("menuplugin.Main");
URL pluginFileUrl = c.getResource("/menuplugin/plugin"); // This returns an URL representing resource on the classpath with a given file name.
InputStream inputStream = pluginFileUrl.openStream();

编辑2:NilsH的答案当然是一个更加优雅的快捷方式。

使用获取插件文件的URL,然后在其上打开一个输入流

ClazzL.getClass().getClassLoader().getResourceAsStream("/menuplugin/plugin")
编辑:您必须使用一个使用您创建的URL类加载器加载的类来执行此操作-而不是原始示例中的类加载器的类加载器--该类只查看父类加载器的类路径,而不是您刚刚创建的类路径

此代码应适用于:

Class c = ClazzL.loadClass("menuplugin.Main");
URL pluginFileUrl = c.getResource("/menuplugin/plugin"); // This returns an URL representing resource on the classpath with a given file name.
InputStream inputStream = pluginFileUrl.openStream();
编辑2:尼尔什的答案当然是一条更加优雅的捷径

ClazzL.getClass().getClassLoader().getResourceAsStream("/menuplugin/plugin")
这不是从类加载器
clazz
加载,而是从定义URLClassLoader的类加载器(即系统类加载器)加载

试一试

这不是从类加载器
clazz
加载,而是从定义URLClassLoader的类加载器(即系统类加载器)加载

试一试


如果
clazz
实际上是一个变量,并且引用了类加载器,那么请尝试

ClazzL.getResourceAsStream("/menuplugin/plugin")

相反。如果执行
clazz.getClass().getClassLoader()
,则尝试从
clazz
类的类加载器加载资源,而不是从您创建的类加载器加载资源。

如果
clazz
实际上是一个变量,并且引用了类加载器,则只需尝试

ClazzL.getResourceAsStream("/menuplugin/plugin")


相反。如果执行
clazz.getClass().getClassLoader()
,则试图从
clazz
类的类加载器加载资源,而不是从您创建的类加载器加载资源。

那么会发生什么?您是否在中获得
?@thiloin在menuaddon.Load中返回线程“main”java.lang.NullPointerException中的
异常。(Load.java:42)在menuaddon.menuaddon.main(menuaddon.java:39)中返回java结果:1
那么会发生什么?您是否在
中获得了
?@thiloin在menuaddon.Load中返回线程“main”java.lang.NullPointerException中的
异常。(Load.java:42)在menuaddon.menuaddon.main(menuaddon.java:39)中返回java结果:1,应该可以工作。主要区别在于您现在使用的是正确的类加载器(与jar关联的类加载器),而不是系统classloader.Yes。我应该更好地解释我自己。编辑了答案。关于这个编辑的问题是,在我加载类之前,我需要这个文件。。。我从filec.getResourceAsStream(“menuplugin/plugin”)=nullOk获得插件的主类,那么NilsH上面的答案应该对你有用,不是吗?应该有用。主要区别在于您现在使用的是正确的类加载器(与jar关联的类加载器),而不是系统classloader.Yes。我应该更好地解释我自己。编辑了答案。关于这个编辑的问题是,在我加载类之前,我需要这个文件。。。我从filec.getResourceAsStream(“menuplugin/plugin”)=nullOk中获取插件的主类,那么NilsH上面的答案应该对您有用,不是吗?clazz.getResourceAsStream(“/menuplugin/plugin”)=nullclazl.getResourceAsStream(“/menuplugin/plugin”)=nullclazz.getResourceAsStream(“/menuplugin/plugin”)=null在不使用前导的
/
的情况下尝试
clazz.getResourceAsStream(“menuplugin/plugin”)
Strange。我创建了一个和你一样的例子,效果很好。。。你确定这个文件在jar中,并且有你正在使用的名称和路径吗?我错的是
插件
位于
/
所以我应该得到的是
clazl.getResourceAsStream(“plugin”)
谢谢你现在的帮助,因为肯定会再次出错:)clazl.getResourceAsStream(“menuplugin/plugin”)=null在不使用前导的
/
的情况下尝试
clazz.getResourceAsStream(“menuplugin/plugin”)
Strange。我创建了一个和你一样的例子,效果很好。。。你确定该文件在jar中,并且有你正在使用的名称和路径吗?我错的是
插件
位于
/
所以我应该得到的是
clazl.getResourceAsStream(“插件”)
现在感谢你的帮助,因为肯定会再次出错:)
ClazzL.getResourceAsStream("/menuplugin/plugin")