以下内容部分来自网络,如有侵权,请站内联系。
Tomcat 下的工程,使用 WebappClassLoader 进行类的加载。查看 WebappClassLoader 源码,可以总结出 Tomcat 的类加载过程如下:
1. 先在自己(即当前 WebappClassLoader)的缓存中查找,有则返回,无则继续;
2. 再递归地在 parent 的缓存中查找,有则返回,无则继续;
3. 缓存中没有。尝试使用 sun.misc.Launcher$AppClassLoader 加载,成功则返回,失败则继续;
这样做的目的是,避免工程中重写了 Java 基础类,造成混乱。换句话说, webapp 下的 java.lang.* 等将被委托给上层的类加载器( ExtClassLoader 或 LaunchClassLoader 等)加载,这样就保证了基础类的安全。请放心,这里 sun.misc.Launcher$AppClassLoader 是不会加载到 webapp 中用户自定义的类的:我们知道 sun.misc.Launcher$AppClassLoader 是用来加载 classpath 中的类的,但 tomcat 消除了 classpath 的概念。
4. 一般情况下,调用自己的 findClass() 方法进行加载,成功则返回,失败则继续;
5. 若自己加载失败,递归请求 parent 进行加载;
6. 若最终都没能加载成功,则抛出 ClassNotFoundException 。
从4、5两步可以看出, Tomcat 的类加载过程和 Java 经典的类加载策略是有出入的,它在一定程度上破坏了双亲委派模型。这样做的目的是为了迎合 Servlet 规范,应用程序类的优先级要高于容器中类的优先级。
一个 WebappClassLoader 对应着一个 Web 应用程序,其父亲是 Tomcat 的 lib 的类加载器。所以 Tomcat 在默认情况下,不是完全按照先 Tomcat 的 lib 再 Web 应用的 lib 这种顺序去加载类的,正确的 Jar 包加载顺序是:
1. JRE 中的 Java 基础包;
2. Web 应用 WEB-INF\lib 下的包;
3. Tomcat\lib 下的包。
所以,如果想在 Web 应用间共享一些 Jar 包,不仅需要将公共包放在 Tomcat 的 lib 下,还要删掉 Web 应用 lib 下的包,否则 Tomcat 启动时还是会优先加载 Web 应用 lib 下的包的。
分享到:
相关推荐
详细说明了tomcat启动过程中 加载资源的顺序
第五部分:Tomcat 类加载机制剖析 第六部分:Tomcat 对 Https 的⽀持及 Tomcat 性能优化策略 nginx 第⼀部分:Nginx基础回顾(Nginx是什么?能做什么事情(应⽤在什么场合)?常⽤命令是什么?) 第⼆部分:Nginx核⼼...
NULL 博文链接:https://caizhenyao.iteye.com/blog/1850375
主要介绍了Java 类在 Tomcat 中是如何加载的过程分析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
1、Tomcat 的缺省端口是多少,怎么修改? 2、tomcat 有哪几种 Connector 运行模式(优化)? 3、Tomcat 有几种部署方式?...12.打印类的加载情况及对象的回收情况 13.Tomcat 一个请求的完整过程 14.Tomcat 工作模式?
文档描述了Tomcat加载流程,启动流程的类图,分析了Tomcat框架的基本架构和原理。
文档是自己在使用过程中总结的,有什么不足之处,还请谅解。
1. TOMCAT的组件介绍及处理请求的流程 2. tomcat管理 3. 提一下tomcat安全和java安全机制 4. java的类加载机制 5. tomcat的类加载机制 6. tomcat搭建集群环境
Request请求到来时,从memcached 2加载备 session 到 tomcat,(当 容器 中还是没有session 则从memcached1加载主 session 到 tomcat, 这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求...
详解tomcat热部署和热加载的方法 我在项目开发过程中,经常要改动Java/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果.有两种方式热部署 和热加载: 1.热加载:在server.xml...
首先,这段代码是hibernate执行有参数的hql的过程中报错的,最上面那层,对string进行强转导致的。 看hql及java对象,发现,参数为string,而参数对应的java对象中的字段类型是BigDcimal。猜测可能是问题出现的原因...
大家都知道,在进行J2EE项目的开发过程中,在调试阶段如果只是修改了页面是不需要重启应用服务器的,比如不需要重启Tomcat。只需要在浏览器中 进行页面刷新即可。其实之所以不用重启Tomcat等应用服务器,其根本原因...
设置tomcat服务器,加载web工程(tomcat插件) 导入坐标(Servlet) 定义处理请求的功能类(UserServlet) 设置请求映射(配置映射关系) 使用SpringMVC技术开发web程序流程 创建web工程(Maven结构) 设置tomcat...
│ ch09.rar 类加载器(实例演示) │ ch12.rar FORM验证登录文件,BASIC验证配置文件,Realm配置代码 │ ch13.rar Tomcat阀的使用(实例演示) │ ch14.rar JDBC资源(实例演示) │ ch17.rar 将Tomcat...
4,如果访问的是sevlet,则使用类加载器,根据configServlet.xml中配置的参数,查找对应的class,载入 5,最后执行方法. 6,可扩展开发,在com.cm.util包下,可编写专门读取txt,ini,propertie等文件的实现类, 当然...
详细图解介绍IIS6与Tomcat6的整合配置过程,并对配置过程中可能出现的问题(如不能加载jakarta,出现函数不正确)进行解决,下面我们就一起看下详细的配置步骤吧
配置过程: 1 安装apache 2 测试apache是否安装成功:http://localhost 出现It works! 3 解压、安装tocmat 4 测试tocmat是否安装成功:http://localhost:8080 5 配置tocmat的jdk: 打开startup.bat...
使用gzip压缩,能够减少数据传输大小,加快网页或APP加载速度。很多大站都开启了gzip压缩,不过也有很多网站并没有开启gzip压缩,本文档使用截图和文字的方式详细讲解了压缩数据的配置和过程,希望对您有益!
假如你现在一个web服务器上又添加了一个9300的tomcat服务,你只需要把我分享的9500端口的xml中的hash末尾9500替换成9300,那么就又是一个新的xml模板。 以此类推,现在喜欢在一个linux服务器上搭建mysql多实例,...
1.详细介绍tomcat 2.简单易懂,帮你弄懂服务器加载一个servlet的详细过程