一个类加载器的高级问题

1.Tomcat服务器是一个大的JAVA程序,这个程序的内部就编写了好多个类加载器,并且加这个类加载器安装到JAVA虚拟机上面。

2.我们实际开发中Servlet也是一个JAVA类,这个Servlet的JAVA类就是被Tomcat自己提供的类加载器加载的。

新建一个 web工程,然后部署Tomcat服务器,新建一个servlet,输入以下代码:

public class MyServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
PrintWriter out=response.getWriter();
ClassLoader loader=this.getClass().getClassLoader();
while(loader!=null){
out.println(loader.getClass().getName());
loader=loader.getParent();
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}//浏览器返回了一个页面如下:


由此,可以明白Servlet是由Apache公司提供的类加载器加载的.而Tomcat加载器,是由sun公司加载的。

我们把MyServlet打包到你当前Tomcat服务器所使用的jdk的目录下,由根类加载器去加载.


这时我们会看到,Tomcat服务器会报一大堆的错误:


上图说明Tomcat服务器未加载到HttpServlet类,说明它已经找到了我当前创建的MyServlet,在用到MyServlet的时候还用到HttpServlet,再去找HttpServlet的时候没找着,就报错。

刚开始,MyServlet和HttpServlet由webAppClassLoader加载,也就是Tomcat自己的加载器加载的。

如果A用到B,B就由加载A的加载器去加载。

如果按sun建议,发布到lib/ext/itcast.jar中后,没有删除web-inf/classes/目录下的MyServlet.class文件,则不应该出现问题。

这说明Tomcat似乎没有按照sun的建议去做,可是根据以前邮件视频中的类加载,可以确定WebAppClassLoader是自己先加载。

补充说明:以上红色部分是摘自张老师高新技术PPT,个人不是很明白,有时间的话,一定要把张老师所有的视频看完。(目标)

同时,也欢迎各位高手给于指点!!

解决上面这个问题,可以把Tomcat服务器中的serlvet-api.jar复制到与itcast.jar同一个目录下。这样extClassLoader就可以直接找到它,如下图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值