关于类加载器的一个应用测试

本文探讨了在Tomcat环境中部署Web项目的类加载过程及机制。通过实例演示了不同类加载器的作用范围,并解决了因类路径冲突导致的HTTP 500错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建一个web项目然后新建一个servlet,在servet的doGet方法中我们循环的遍历出所有的类加载器(由低到高)
ClassLoader loader = this.getClass().getClassLoader();
while(loader != null){
out.println(loader.getClass().getName()+"<br>");
loader = loader.getParent();
}


接着将这个web项目部署到web应用服务器上(tomcat5.0),访问结果如下:
WebappClassLoader
StandardClassLoader
AppClassLoader
ExtClassLoader
好了,通过结果我们可以看出它是由WebappClassLoader加载器加载的,其上面还有四个类加载器,其中有三个是jdk提供的(BootStrap是内嵌在虚拟机中),下面我们就将servlet打成.Jar包放到我们的tomcat所用的jdk安装目录下的jre/lib/ext/下中让
ExtClassLoader去加载,以上操作完成后下面我们就再次访问这个servlet
结果出错了。http500错误!
下面我们分析一下出错原因:当ExtClassLoader加载该serlvet程序的时候,会首先根据类加载器的委派机制交给它的父亲(BootStrap)去加载,由于它父亲没有找到该类,所以就又交给它来加载,当他加载这个servlet的时候,他发现我们的这个servlet类extends HttpServlet所以它就又去加载httpservlet类,结果确没有找到,所以就报错了,因为这个jar包类是由tomcat提供的,因此我们需要拷贝httpservlet类到我们ext目录下,把tomcat lib中的servlet-api.jar拷贝到ext目录下面就可以解决这个问题了。
下面是关于分析原因图:

[img]http://dl.iteye.com/upload/attachment/229751/faf601f3-0222-3ea4-b421-3c616c875159.jpg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值