gpt4 book ai didi

java - Tomcat 类加载器违反委托(delegate)策略

转载 作者:搜寻专家 更新时间:2023-11-01 02:15:26 24 4
gpt4 key购买 nike

  • 问题 1:我们知道,当一个类加载器要加载一个类时,它将请求委托(delegate)给它的父类加载器。然而在 Tomcat 中,它不会:你可以加载你的类来覆盖放在公共(public) lib 目录中的同名类。这意味着 Tomcat WebappClassloader 不遵循委托(delegate)策略。是否违反约定?

  • 问题 2:我写了一个类并将它放在公共(public) lib 目录中,显然该类是在 Web 应用程序之间共享的。例如,每个网络应用程序都可以读/写类的静态字段。此外,JDK 中的类由 Bootstrap 类加载器加载,然后它们的静态字段被任何 Web 应用程序共享,是否危险?

最佳答案

此行为是有意为之的,它允许您在每个 WAR 中独立地覆盖 Tomcat 本身提供的库。例如,您可以为每个部署到容器的应用程序使用不同版本覆盖 Log4J,而不会引入任何问题或破坏其他应用程序。来自 Tomcat documentation :

Like many server applications, Tomcat installs a variety of class loaders [...] to allow different portions of the container, and the web applications running on the container, to have access to different repositories of available classes and resources. This mechanism is used to provide the functionality defined in the Servlet Specification, version 2.4 — in particular, Sections 9.4 and 9.6.

它确实违反了正常的委托(delegate)算法,但这也是其他应用程序服务器(例如 JBoss)的工作方式。

广告。问题2:是的,这很危险,你必须记住同步并且无法控制谁修改了这个变量。我会避免 static全部字段。

例如EhCache让你分享 CacheManager .这是通过 net.sf.ehcache.CacheManager#singleton 实现的static volatile field 。现在你遇到了各种各样的问题:如果你输入 ehcache.jar在 Tomcat 的 /lib ,它将按预期工作。但是,如果每个 Web 应用程序都有自己的 JAR 文件副本,则共享将不起作用,因为每个 Web 应用程序都有自己的 CacheManager 副本。类(class)。当只有一个应用程序有自己的 ehcache.jar 时,情况会变得更糟。 - 所有应用程序将共享 CachedManager 的同一个实例除了有 ehcache.jar 的那个包装在一起。这样的错误很难追踪...

关于java - Tomcat 类加载器违反委托(delegate)策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com