Tomcat容器是我们一直都在接触的容器,我们在工作中修改了jsp文件之后往往不用重启启动容器,jsp修改后的内容就会显示出来,这就是基于类加载来实现的。下面我们就对热加载和热部署来进行分析和学习。
热加载

common类加载器:是应用类加载器的父类加载器,是tomcat最顶层的共用类加载器。其默认加载的jar包路径是${catalina.home}/lib下的。catalina.home是由catalina.properties中的common.loader指定的
catalina类加载器:是common类加载器的子类加载器,用于加载tomcat应用服务器的类加载器,加载路径是由server.loader指定,默认为空,说明交由common类加载器加载
shared类加载器:是common类加载器的子类加载器,用于加载web应用服务器的类加载器,加载路径是由shared.loader指定,默认为空,说明交由common类加载器加载
webApp类加载器:是shared类加载器的子类,加载/WEB-INF/classes目录下的未压缩的Class和资源文件以及/WEB-INF/lib目录下的jar包,该类加载器只对当前Web应用可见,对其他Web应用均不可见。
jsp类加载器:是webApp类加载器的子类,加载每个web应用中的jsp文件
当我们修改jsp文件之后,当这个文件的最后的修改时间发生了变化,就新建一个jsp类加载加载这个jsp文件,在把加载后的文件置入到JVM内存中后,就把原先的jsp文件利用gc回收掉。
上面我们对热加载进行了学习,现在我们来对热部署进行学习。最初在学习时对热加载和热部署的理解是这两个东西的原理都是一样的,最终经过讨论之后,发现这两个虽说实现方式都是基于破坏了双亲委派机制来实现的,但是他们的用途是不相同的。热加载适用于当我们修改jsp文件和修改java文件少量内容时[这里不包括静态变量、类名等属性],是不需要重新启动容器的。
而热部署针对的是每个web应用,当我们修改了java文件中的静态变量和类名等属性之后,和JVM内存中对应的属性不相同时,这时就需要采用热部署的方式。下面是小编我自己思考出来的一种可落地的大致方案:




