【问题标题】:Need help understanding Tomcat vs WepApp classloading issue需要帮助了解 Tomcat 与 WebApp 类加载问题
【发布时间】:2020-09-06 14:46:02
【问题描述】:

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

在我的 web 应用程序中使用 Spring,我有 connectionfactories 和 listeners。它们是在我的 web 应用启动时创建的,但它们使用的类是从 lib 文件夹中的 jar 加载的。

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

这是为什么呢?我认为我的 web 应用程序的类加载器是我的战争中的一组联合类,以及驻留在 tomcat 库中的类,但似乎如果该类驻留在 tomcat 库中,它无法“看到”我的战争库中的类.

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

【问题讨论】:

    标签: java spring tomcat activemq classloader


    【解决方案1】:

    Tomcat 有 几个类加载器,你将 jar 放入 Common classloader

    通常,应用程序类不应放在此处

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

    在 Java 环境中,类加载器排列在父子树中。通常,当要求类加载器加载特定的类或资源时,它首先将请求委托给父类加载器,然后仅在父类加载器找不到请求的类或资源时才查看自己的存储库.

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

    【讨论】:

    • 是的,当然。但我认为这适用于每一堂课。在这种情况下,ActiveMQ 类是在 common 类加载器中找到的,但似乎 activemq 类使用的任何其他类也必须放在 common 目录中。我原以为 ActiveMQ 类需要的下一个类会以同样的方式进行尝试。
    • @Mathias 你只能搜索你级别或以上的课程,而 webapp 低于 common
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    相关资源
    最近更新 更多