gpt4 book ai didi

java - tomcat共享库-(配置)文件上下文规则

转载 作者:行者123 更新时间:2023-11-28 22:38:20 25 4
gpt4 key购买 nike

在 Tomcat 6 的 lib (${catalina.home}/lib/) 文件夹中,我有几个共享的 JAR 文件,例如 Hibernate 的。

当我调试我的网络应用程序时,控制台会通过 Hibernate 获得大量输出,除非我将 logback.xml 放入 ${catalina.home}/lib/

这是问题的重点:
如果我将相同的 logback.xml 移动到我的网络应用程序的 /WEB-INF/lib/ 文件夹中,它将被忽略,就好像没有文件一样 - 我得到了所有输出。

这显然与上下文相关(我认为在 Java 级别上),但我找不到相关信息。
请帮助我更好地理解它的基础知识。

谢谢!

最佳答案

我敢打赌它与上下文无关,而是与类路径层次结构相关。 Java 基础设施提供了一种机制 ( ClassLoader ) 来构建类路径层次结构,而 Tomcat(与许多其他 servlet 容器/应用程序服务器一样)使用它来隔离特定应用程序中使用的不同 JAR/类文件夹。

根类加载器在层次结构中的可见性较低,嵌套类加载器可以在其范围内查找类,如果找不到,则向父类加载器询问。一些应用程序服务器允许将类加载器配置为首先询问父级,如果父级无法找到它,然后在自己的范围内查看。但是,父类加载器永远无法从嵌套类加载器加载类。

注意:与您的 logback.xml 一样,普通文件也会发生同样的情况。

因此,您在 Tomcat 的 lib 文件夹中部署了一些 hibernate 库,这些库由层次结构中的根类加载器处理。当您在该文件夹中有您的 logback.xml 文件时,它实际上与您的 Hibernate JAR 处于相同的类路径层次结构级别,因此 Hibernate(或它使用的日志机制)可以加载该文件,因为它是在其范围内。

另一方面,您的应用程序 (WEB-INF/lib) 使用的库由不同的类加载器处理,该类加载器实际上嵌套到前面提到的类加载器。当您将 logback.xml 移动到应用程序的库文件夹时,您实际上是将其移动到更广泛的范围,但是,由于 Hibernate 已由父类加载器加载,它不能在其范围内定位文件(请记住,父类加载器无法从其子类加载类或文件,只有子类可以向父类加载这些类或文件)。

关于java - tomcat共享库-(配置)文件上下文规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11971330/

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