为什么要自定义classloader
发布网友
发布时间:2022-04-21 04:23
我来回答
共2个回答
热心网友
时间:2022-06-17 23:21
出于两方面原因:
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 不会被覆盖。
热心网友
时间:2022-06-17 23:21
导致问题的原因:tomcat自定义了一部分包,此部分包中的类路径和项目中的包路径和类名称一致。此过程中如果先加载到的是tomcat的包,并且正好项目中用到了此类,那么就会出现包冲突。备注:当前发现最常见的是servlet.api.jar包中的类与tomcat中的某些类冲突,所以用tomcat作为容器的时候删除此包即可,其余的包只能是根据实际情况进行分析了。