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.
我的假设有错吗?
如何从外部 Jar 加载 class,它恰好是从 WebApplication classloader 中加载的父 class 扩展的?
我尝试将我的 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);
我有一个 java Web 应用程序,它带有一个抽象 class,(我们称之为 ClassA
)部署在应用程序服务器上。此 java Web 应用程序还使用 this question's accepted response.
一切正常,直到我加载从 ClassA
扩展的 class(称之为 ClassB
)。我在 SysOut 上收到 java.lang.ClassNotFoundException: ClassA
错误消息,指向加载 class 的行:urlClassLoader.loadClass(className);
.
我假设我不会有问题,因为当我调用 URLClassLoader.newInstance()
时,它被创建 from the default parent class loader,我想应该是 SystemClassLoader
,我假设它包含WebApp classes.
我的假设有错吗?
如何从外部 Jar 加载 class,它恰好是从 WebApplication classloader 中加载的父 class 扩展的?
我尝试将我的 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);