3

在我之前的问题中,我询问了如何加载远程 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 然后回退到默认值?

谢谢,
巴特

4

2 回答 2

2

您可以将应用程序类加载器设置为 url 类加载器的父级:

URLClassLoader loader = new URLClassLoader(
       new URL[]{f.toURI().toURL()}, Module.class.getClassLoader());

来自Oracle Java 教程(类加载机制):

Java 平台使用委托模型来加载类。基本思想是每个类加载器都有一个“父”类加载器。加载类时,类加载器首先将搜索类“委托”给其父类加载器,然后再尝试查找类本身。

于 2013-05-06T20:22:00.740 回答
0

我遇到了同样的问题,我使用的是 Java 9,将其降级到 Java 8 解决了我的问题。

于 2018-03-13T11:08:19.740 回答