【问题标题】:Jave Class under shared/classes and war file - priority of loading in tomcat共享/类和war文件下的Java类-在tomcat中加载的优先级
【发布时间】:2024-01-21 22:59:01
【问题描述】:

有人对以下场景有很好的了解吗?

一个类可以部署在tomcat的不同位置。它可以是简单的 .class 或打包在 jar 文件中。我在这里列出了这些选项:

apache-tomcat-6.0.35\shared\classes
apache-tomcat-6.0.35\shared\lib
apache-tomcat-6.0.35\lib
apache-tomcat-6.0.35\webapps\examples\WEB-INF\classes
apache-tomcat-6.0.35\webapps\examples\WEB-INF\lib

如果同一个类部署在所有这些位置(类文件夹层次结构中的.class 或打包在 jar 文件中并复制到 *\lib\ 层次结构下),tomcat 的类加载器将使用什么规则来识别该类它最终会使用吗?

【问题讨论】:

  • 来自 tomcat 官方文档站点tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html 因此,从 web 应用程序的角度来看,类或资源加载在以下存储库中查找,顺序如下: JVM 系统类加载器类的引导类(如上所述)您的 Web 应用程序的 /WEB-INF/classes 您的 Web 应用程序的 /WEB-INF/lib/*.jar 通用类加载器类(如上所述)

标签: java class tomcat jar classloader


【解决方案1】:

经过更多研究,我找到了答案:

来自tomcat官方documentation site
因此,从 Web 应用程序的角度来看,类或资源加载按以下顺序查看以下存储库

JVM 的引导类
系统类加载器类(如上所述)
/WEB-INF/Web 应用程序的类
您的 Web 应用程序的 /WEB-INF/lib/*.jar
通用类加载器类(如上所述)

“通用类加载器”搜索的位置由 $CATALINA_BASE/conf/catalina.properties 中的 common.loader 属性定义。这是我们启用/定义共享位置的地方; shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar

上面的顺序说明了逻辑。

【讨论】:

    【解决方案2】:

    这很好地解释了它......

    http://www.mulesoft.com/tcat/tomcat-classpath#how-it-differs

    注意

    在 Tomcat 5.x 中,“共享”加载器负责加载要在应用程序之间共享的类,位于目录 $CATALINA_HOME/shared/lib 中。这在 Tomcat 6 中被放弃了,以引导用户在每个相关上下文中简单地复制共享依赖项,以提高可移植性。这个加载器也被替换为通用加载器。

    因此,如果您使用的是 Tomcat 6,“共享”可能无法按预期工作。

    塔,

    -布雷特

    【讨论】:

    • 本文档没有具体说明出现在所有这些位置的同一类。我对它特别感兴趣。
    最近更新 更多