前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 类在 Tomcat 中是如何加载的?

Java 类在 Tomcat 中是如何加载的?

作者头像
Java技术栈
发布于 2019-09-26 07:21:48
发布于 2019-09-26 07:21:48
2.6K0
举报
文章被收录于专栏:Java技术栈Java技术栈

作者 :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中包括集中类加载器:

  1. BootStrapClassLoader 引导类加载器
  2. ExtClassLoader 扩展类加载器
  3. AppClassLoader 应用类加载器
  4. CustomClassLoader 用户自定义类加载器

他们的区别上面也都有说明。需要注意的是,不同的类加载器加载的类是不同的,因此如果用户加载器1加载的某个类,其他用户并不能够使用。

当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制)

  1. 用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层。
  2. 最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类。
  3. 如果一直到底层的类加载都没有加载到,那么就会抛出异常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 -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
使用 Python 按行和按列对矩阵进行排序
假设我们采用了一个输入的 MxM 矩阵。我们现在将使用嵌套的 for 循环对给定的输入矩阵进行逐行和按列排序。
很酷的站长
2023/02/22
6.6K0
使用 Python 按行和按列对矩阵进行排序
C#经典十大排序算法(完结)
冒泡排序算法是一种基础的排序算法,它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐步"冒泡"到数列的末尾。
追逐时光者
2023/10/25
3400
重学数据结构和算法(五)之归并排序、快速排序
冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。归并排序和快速排序的时间复杂度为 O(nlogn) 。这两种排序算法适合大规模的数据排序
六月的雨
2021/09/26
1.3K0
重学数据结构和算法(五)之归并排序、快速排序
十大经典排序算法最强总结(含Java、Python码实现)
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
10JQKA
2020/12/31
9690
十大排序算法理解总结
1、时间复杂度:O(n2)O(n^2)O(n2) 2、空间复杂度:O(1)O(1)O(1) 3、稳定排序 4、原地排序
鳄鱼儿
2024/05/21
1370
文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题
首先,为了证明RANDOMIZED-QUICKSORT的期望运行时间是Ω(nlg n),我们需要证明在最坏的情况下,该算法的运行时间是O(nlg n)。然后,我们需要证明在最坏的情况下,算法的期望运行时间是Ω(nlg n)。
福大大架构师每日一题
2023/08/29
3110
文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题
归并排序
归并排序是采用分治法的典型应用,而且是一种稳定的排序方式,不过需要使用到额外的空间。
Li_XiaoJin
2022/06/10
2940
归并排序
JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序
笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。
夜尽天明
2019/07/30
2.4K0
排序算法-下(Java语言实现)
的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。
acc8226
2022/05/17
4560
排序算法-下(Java语言实现)
快排查找数组中的第K个最大元素
两种时间复杂度为O(nlogn)的排序算法,归并排序和快速排序。这两种排序算法适合大规模数据排序,更常用。
JavaEdge
2021/12/07
4.1K0
快排查找数组中的第K个最大元素
八大排序算法总结与java实现
因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习。首先罗列一下常见的十大排序算法:
林老师带你学编程
2019/05/27
9160
八大排序算法
​ 八大排序算法是面试经常考到的,尤其是快排,希尔排序和归并也是经常会让写代码的题目,其实只要用一句话说明了他们的原理我们写起代码就没那么困难。 冒泡排序 思想:有 n 个数我们就进行 n-1 趟排序,每一趟我们都选取最大的一个数放到已经排序的位置即可。 伪代码:两个 For 循环,外层表示要进行的趟数,内层则是找出最大的数,找最大的数的方法就是比较、交换。 时间复杂度:O(n2) 空间复杂度:O(n) 代码: package Sorting; import org.junit.jupiter.ap
lwen
2018/04/17
9270
八大排序算法
剑指offer | 面试题38:数组中的逆序对
「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:
千羽
2022/02/23
1K0
剑指offer | 面试题38:数组中的逆序对
排序算法之希尔、归并、堆和基数排序
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/28
5250
Python3实现快速排序、归并排序、堆
# -*- coding: utf-8 -*- # @Time : 2019-03-26 16:46 # @Author : Jayce Wong # @ProjectName : leetcode # @FileName : sorting.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce import random
py3study
2020/01/06
3420
[数据结构与算法] 排序算法之冒泡排序与快速排序(快排)
冒泡排序法 冒泡排序(Bubble Sorting)的基本思想是: 通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水
时间静止不是简史
2020/07/25
3840
排序算法最强总结及其代码实现(Python/Java)
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
蛮三刀酱
2019/03/26
5180
排序算法最强总结及其代码实现(Python/Java)
排序进行曲-v2.0
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9733adc7ec9467cb835499ec469cdac.png
学编程的小程
2023/10/11
1840
排序进行曲-v2.0
Python Data Structures - C2 Sort
参考内容: 1.Problem Solving with Python Chapter5: Search and Sorting online_link 2.算法导论
宅男潇涧
2018/08/01
4420
Python Data Structures - C2 Sort
【剑指offer:数组中的逆序对】暴力法、归并排序(JavaScript实现)
时间复杂度是$O(N^2)$。在 leetcode 上会 TLE,无法通过(毕竟这是道标注「困难」的题目)。
心谭博客
2020/04/21
1K0
相关推荐
使用 Python 按行和按列对矩阵进行排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档