为什么tomcat要自定义classloader

2025-05-20 09:13:25
推荐回答(1个)
回答1:

出于两方面原因:
  1、Servlet规范中对于类加载器的要求

  2、实现不同web app 的类隔离。
  各个classloader作用说明:
  1、bootstrap / extension: 加载$JAVA_HOME/jre/lib/ext下的类
  2、system: 加载由CLASSPATH初始化的所有类,对于tomcat自身类以及所有web应用的类可见。但是查看tomcat标准的启动脚本$CATALINA_HOME/bin/catalina.bat, 完全无视CLASSPATH,直接加载tomcat中的3个jar包。
  3、Common: 对于tomcat,和所有web app 可见,用于加载$CATALINA_BASE/conf/catalina.properties里面的类,通常应用程序的类不建议放在里面。默认加载:
  
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar

  4、WebappX: 加载所有WEB-INF/classes下面的类以及里面的jar。
  该classloader有意违背了委托原则。它首先看WEB-INF/classes中是否有请求的类,而不是委托parent classloader去处理,但是jre 和servlet api 不会被覆盖。