System——这个类加载器通常从CLASSPATH环境变量的内容中初始化。所有这些类对 Tomcat 内部类和 Web 应用程序都是可见的。但是,标准的 Tomcat 启动脚本($CATALINA_HOME/bin/catalina.sh或 %CATALINA_HOME%\bin\catalina.bat)完全忽略了CLASSPATH环境变量本身的内容,而是从以下存储库构建 System 类加载器:
WebappX — 为部署在单个 Tomcat 实例中的每个 Web 应用程序创建一个类加载器。/WEB-INF/classesWeb 应用程序目录中的所有解压类和资源,以及 Web 应用程序/WEB-INF/lib目录下 JAR 文件中的类和资源,都对这个 Web 应用程序可见,但对其他 Web 应用程序不可见。
如上所述,Web 应用程序类加载器不同于默认的 Java 委托模型(根据 Servlet 规范 2.4 版第 9.7.2 节 Web 应用程序类加载器中的建议)。当加载从Web应用程序的一个类的请求WebappX被处理的类加载器,这个类加载器会在本地资源库第一,而不是在查看之前委托。有例外。作为 JRE 基类一部分的类不能被覆盖。对于某些类(例如 J2SE 1.4+ 中的 XML 解析器组件),Java 认可的特性可以在 Java 8 之前使用。最后,类加载器将显式忽略包含 Servlet API 类的任何 JAR 文件 — 请勿包含此类Web 应用程序中的 JAR。Tomcat 中的所有其他类加载器都遵循通常的委托模式。
因此,从 Web 应用程序的角度来看,类或资源加载按以下顺序查看以下存储库:
JVM 的引导类
您的 Web 应用程序的/WEB-INF/classes
您的 Web 应用程序的/WEB-INF/lib/*.jar
系统类加载器类(如上所述)
常见的类加载器类(如上所述)
如果配置了 Web 应用程序类加载器 , <Loader delegate="true"/> 则顺序变为: