Java 在 ChildClassLoader 中动态加载 Class 与 SystemClassLoader 相关

Java Load Class Dinamically in ChildClassLoader related to SystemClassLoader

我有一个 java Web 应用程序,它带有一个抽象 class,(我们称之为 ClassA)部署在应用程序服务器上。此 java Web 应用程序还使用 this question's accepted response.

上的方法从外部 jar 动态加载 classes

一切正常,直到我加载从 ClassA 扩展的 class(称之为 ClassB)。我在 SysOut 上收到 java.lang.ClassNotFoundException: ClassA 错误消息,指向加载 class 的行:urlClassLoader.loadClass(className);.

我假设我不会有问题,因为当我调用 URLClassLoader.newInstance() 时,它被创建 from the default parent class loader,我想应该是 SystemClassLoader,我假设它包含WebApp classes.

我尝试将我的 WebApp 的部署配置从先父更改为后父,但遇到了同样的错误。我也尝试在执行 URLClassLoader.loadClass("ClassB") 行之前执行 Class.forName("ClassA") 但再次遇到相同的错误。

似乎 ClassA 是由某个容器的 WebAppClassLoader 加载的,它是 SystemClassLoader 的子容器。您的自定义 URLClassLoader 也是 SystemClassLoader 的子项,这就是 ClassB 不 "see" ClassA.

的原因

要解决这个问题,ClassB 应该由 WebAppClassLoader 或其子加载,可以通过以下方式实现:

ClassLoader webAppCL = ClassA.class.getClassLoader();
URLClassLoader myCL = new URLClassLoader(urls, webAppCL);