在前面的问题中,我询问了如何加载远程jar文件。我当前的代码是:
//f is the path to the jar
URLClassLoader loader = new URLClassLoader(new URL[]{f.toURI().toURL()});
Class<?> jarClass = Class.forName(main, true, loader);
Class<? extends Module> module = jarClass.asSubclass(Module.class);
Constructor<? extends Module> constructor = module.getConstructor();
System.out.println(constructor);
Module module = constructor.newInstance();这工作得很好,但是远程加载的模块扩展了加载它们的jar中的一个类,这会给出这个错误:
原因: java.lang.ClassNotFoundException: package.whatever.Module,我认为这是因为它使用的是URLClassLoader而不是getClass().getClassLoader()..怎样才能让它使用URLClassLoader,然后回退到默认的呢?
谢谢,
巴特
发布于 2013-05-07 04:22:01
您可以将应用程序类加载器设置为url类加载器的父类:
URLClassLoader loader = new URLClassLoader(
new URL[]{f.toURI().toURL()}, Module.class.getClassLoader());在Oracle Java tutorial (类加载机制)中:
平台使用委托模型来装入类。基本思想是每个类加载器都有一个“父”类加载器。装入类时,类装入器在尝试查找类本身之前,首先将搜索类的任务“委托”给它的父类装入器。
发布于 2018-03-13 19:08:20
我遇到了同样的问题,我使用Java 9,将它降级到Java 8解决了我的问题。
https://stackoverflow.com/questions/16405388
复制相似问题