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")