0

我有一个带有抽象类的Java Web 应用程序,(我们称之为ClassA)部署在应用程序服务器上。这个 java web 应用程序还通过使用这个问题的接受响应的方法动态地从外部 jar 加载类。

一切正常,直到我加载一个ClassBClassA. 我在 SysOut 上收到一条java.lang.ClassNotFoundException: ClassA错误消息,指向加载类的行:urlClassLoader.loadClass(className);.

我以为我不会有问题,因为当我调用 时URLClassLoader.newInstance(),它是从默认的父类加载器创建的,我认为它应该是SystemClassLoader,我假设它包含 WebApp 类。

  • 我的任何假设是错误的吗?

  • 如何从外部 Jar 加载一个类,该 Jar 恰好从 WebApplication 类加载器中加载的父类扩展?

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

4

1 回答 1

1

似乎它ClassA是由某个容器加载的WebAppClassLoader,它是SystemClassLoader. 你的习惯URLClassLoader也是一个孩子,SystemClassLoader这就是为什么ClassB不“看到”的原因ClassA

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

ClassLoader webAppCL = ClassA.class.getClassLoader();
URLClassLoader myCL = new URLClassLoader(urls, webAppCL);
于 2016-03-09T15:25:38.973 回答