1

我想问一下 UrlClassLoaders。我编写了一个运行良好的主 .jar 文件。现在我想让它能够从它的一个文件夹中加载插件。我一直写到它在文件夹中找到 .jar 文件,可以在其中列出它们的类(它们的名称、路径)。问题是当我要求他找到该类(以创建它的实例)时,他们不会找到它从我的主 jar 文件继承的类,如下所示:

IN MAIN JAR:
-class Expansion { ... }

In a plugin jar:
-class ExpansionA extends MainJar.Expansion { ... }

因此,当我要求 UrlClassLoader 解析“ ExpansionA ”类时,它将在插件 jar 中搜索“ Expansion ”类而不是 MainJar,并且插件 jar 中没有“ Expansion ”类,因为它从 MainJar 继承为资源库...并在defineClass方法时引发 NoDefFoundForClassError 异常。我怎样才能告诉他也检查 MainJar 中的课程?(它不仅是关于 1 个类,而且我希望插件能够从 MainJar 继承任何类)。你能帮我吗?

4

1 回答 1

1

ClassLoaders 有一个父级,加载请求首先被委托给该父级。为确保您正在创建的新类加载器可以访问该类Expansion,您应该将新类的父级设置ClassLoaderClassLoader类的Expansion

ClassLoader myLoader=newURLClassLoader(urls, Expansion.class.getClassLoader());

这不仅确保Expansion该类将被 找到myLoader,它还将保证它解析为相同的运行时类(首先询问父级)。如果插件 jar 包含该类的副本,这很重要。

于 2014-01-16T17:37:31.620 回答