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

新建一个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目录下面就可以解决这个问题了。
下面是关于分析原因图:

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


你可能感兴趣的:(tomcat,Web,应用服务器,servlet,ext)