需要帮助理解 Tomcat vs WepApp 类加载问题

Need help understanding Tomcat vs WepApp classloading issue

我在 Tomcat 上有 3 个网络应用 运行。他们都使用 ActiveMQ。出于这个原因,我将 activemq-all.jar 放在 Tomcat /lib 文件夹中。

在我的网络应用程序中使用 Spring 我有连接工厂和监听器。它们是在我的 webapp 启动时创建的,但是 class 它们使用的是从 lib 文件夹中的 jars 加载的。

我认为我看到的是 activemq-classes 具有的任何依赖项也必须驻留在 tomcat 库中。例如 xbean-spring.jar 或任何 Spring class 之类的东西。即使我的 war 库中有它们,我也会得到 ClassNotFound。

这是为什么?我认为我的 webapp 的 classloader 是来自我的 war 的 classes 和位于 tomcat 库中的 classes 的联合集合,但似乎如果 class 驻留在 tomcat 库中,它就不能 "see" 我的 war 库中的 classes。

如果有人能帮助我解决这个问题,我将不胜感激。

Tomcat 有 多个 classloader,你正在将 jar 放入 Common classloader

Normally, application classes should NOT be placed here

它只能在自身或父 class 加载器中搜索 classes,不包括您的 webapp

In a Java environment, class loaders are arranged in a parent-child tree. Normally, when a class loader is asked to load a particular class or resource, it delegates the request to a parent class loader first, and then looks in its own repositories only if the parent class loader(s) cannot find the requested class or resource.

  Bootstrap
      |
   System
      |
   Common
   /     \
Webapp1   Webapp2 ...