class没有发布到tomcat_Java 类在 Tomcat 中是如何加载的?
作者 :xingoo
https://www.cnblogs.com/xing901022/p/4574961.html
说到本篇的Tomcat类加载机制,不得不说翻译学习Tomcat的初衷。
之前实习的时候学习JavaMelody的源码,但是它是一个Maven的项目,与我们自己的Web项目整合后无法直接断点调试。
后来同事指导,说是直接把Java类复制到src下就可以了。很纳闷....为什么会优先加载src下的Java文件(编译出的class),而不是jar包中的class呢?
现在了解Tomcat的类加载机制,原来一切是这么的简单。
一、类加载
在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载。
比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。
因此使用哪种类加载器、在什么位置加载类都是JVM中重要的知识。
二、JVM类加载
JVM类加载采用:父类委托机制,如下图所示:
JVM中包括集中类加载器:
BootStrapClassLoader 引导类加载器
ExtClassLoader 扩展类加载器
AppClassLoader 应用类加载器
CustomClassLoader 用户自定义类加载器
他们的区别上面也都有说明。需要注意的是,不同的类加载器加载的类是不同的,因此如果用户加载器1加载的某个类,其他用户并不能够使用。
当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制):
用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层。
最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类。
如果一直到底层的类加载都没有加载到,那么就会抛出异常ClassNotFoundException。
因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。
三、Tomcat类加载
在Tomcat中类的加载稍有不同,如下图:
当Tomcat启动时,会创建几种类加载器:
1、Bootstrap 引导类加载器
加载JVM启动所需的类,以及标准扩展类(位于jre/lib/ext下)
2、System 系统类加载器
加载Tomcat启动的类,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下。
3、Common 通用类加载器
加载Tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar
4、webapp 应用类加载器
每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件。Tomcat 的 Server 文件配置详解!这篇推荐大家看下。
当应用需要到某个类时,则会按照下面的顺序进行类加载:
1、使用bootstrap引导类加载器加载
2、使用system系统类加载器加载
3、使用应用类加载器在WEB-INF/classes中加载
4、使用应用类加载器在WEB-INF/lib中加载
5、使用common类加载器在CATALINA_HOME/lib中加载
四、问题扩展
通过对上面Tomcat类加载机制的理解,就不难明白 为什么Java文件放在Eclipse中的src文件夹下会优先jar包中的class?
这是因为Eclipse中的src文件夹中的文件Java以及webContent中的JSP都会在Tomcat启动时,被编译成class文件放在 WEB-INF/class中。
而Eclipse外部引用的jar包,则相当于放在 WEB-INF/lib 中。
因此肯定是 Java文件或者JSP文件编译出的class优先加载。
通过这样,我们就可以简单的把Java文件放置在src文件夹中,通过对该Java文件的修改以及调试,便于学习拥有源码Java文件、却没有打包成xxx-source的jar包。
另外呢,开发者也会因为粗心而犯下面的错误。
在 CATALINA_HOME/lib 以及 WEB-INF/lib 中放置了 不同版本的jar包,此时就会导致某些情况下报加载不到类的错误。
还有如果多个应用使用同一jar包文件,当放置了多份,就可能导致 多个应用间 出现类加载不到的错误。
- END -
关注Java技术栈微信公众号,在后台回复关键字:Java,可以获取一份栈长整理的 Java 最新技术干货。
最近干货分享
年轻人的第一个自定义 Spring Boot Starter!
一份完整的 MySQL 开发规范,进大厂必看!
面试一个 3 年 Java 程序员,一个问题都不会!
Intellij IDEA 2019 最新乱码解决必杀技
分享一份 2019 最新 Java 架构师学习资料
点击「」加入栈长的战队~
class没有发布到tomcat_Java 类在 Tomcat 中是如何加载的?相关推荐
- Java 类在 Tomcat 中是如何加载的?
说到本篇的Tomcat类加载机制,不得不说翻译学习Tomcat的初衷. 之前实习的时候学习JavaMelody的源码,但是它是一个Maven的项目,与我们自己的Web项目整合后无法直接断点调试. 后来 ...
- 多项目加载顺序修改_面试官:Java 类在 Tomcat 中是如何加载的?
说到本篇的Tomcat类加载机制,不得不说翻译学习Tomcat的初衷. 之前实习的时候学习JavaMelody的源码,但是它是一个Maven的项目,与我们自己的Web项目整合后无法直接断点调试. 后来 ...
- 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的
死磕Tomcat系列(6)--Tomcat如何做到热加载和热部署的 热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用. 通常情况下在开发环境中我们使用的是热加载 ...
- yii2 引入php文件,Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
本文实例分析了Yii2中YiiBase自动加载类.引用文件的方法.分享给大家供大家参考,具体如下: 在Yii2中这个函数是用来加载类的,没有直接引用文件的相关实现.但是这个也可以用来引用文件. pub ...
- 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...
类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了! 我们知道在一个类中,类的加载顺序为 静态代码块-->普通代码块-->构造代码块,感觉静态块始终是最先初始化的,其实并不是,下面 ...
- Vue中使用Openlayers加载Geoserver发布的TileWMS时单击获取shp文件的坐标信息
场景 Vue中使用Openlayers加载Geoserver发布的TileWMS: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...
- Vue中使用Openlayers加载Geoserver发布的TileWMS
场景 Openlayers下载与加载geoserver的wms服务显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114 ...
- Vue中使用Openlayers加载Geoserver发布的ImageWMS
场景 Openlayers下载与加载geoserver的wms服务显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114 ...
- 中yeti不能加载_第二十章_类的加载过程详解
类的加载过程详解 概述 在 Java 中数据类型分为基本数据类型和引用数据类型.基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载 按照 Java 虚拟机规范,从 Class 文件到加载到内 ...
最新文章
- VISP视觉库框架详细解释
- 求你了,别再用 print 调试代码了
- on java 8 学习笔记 2022.2.17-2022.2.18
- Magento Block设计分析(深入分析)
- CSS 定位 四种定位
- iphone个系列尺寸_最值得入手的4款iPhone,都是内行人的最爱,拿出去有面子
- Kali Linux 和 渗透测试
- java中接口可以产生数组吗,java接口Array介绍
- Python100经典练习题,附答案
- android 电影院订票系统 论文,基于Android平台的电影票订票系统的设计与实现
- 二阶低通有源滤波器设计与仿真测试
- 关键路径算法——AOE网
- VastBase账户锁The account has been locked
- make headers_install 用法
- 输入框限制输入表情的方法
- Python反反爬系列(一)----K近邻算法与CSS动态字体加密
- 汉谟塔C语言,巴别塔的故事
- 中国黑客档案:中国红客联盟(转)
- linux环境变量设置 (PS1,PS2)
- Java开发在线打开编辑保存Word文件(支持多浏览器)