idea的热加载怎么实现的?

电脑信息 2021-08-01 设置问题 30 ℃
正文

1. 题主说的IDEA 热加载是什么idea自动编译设置?

在IDEA中开发WEB项目时idea自动编译设置,IDEA的 发布按钮带来的热加载

IDEA插件带来的热加载注意:热加载 热部署 热更新 实际上是一个概念,下文中会混用idea自动编译设置。2. 简单解释下这两种形式

1)IDEA在开发WEB项目时idea自动编译设置,热部署按钮的或者启动按钮的四个选项,如图

事实上idea自动编译设置,IDEA通过tomcat运行项目时需要指定tomcat的home目录,然后启动时IDEA会运行

catlina.bat

并指定上下文配置目录,web根目录(就是项目)idea自动编译设置。配置和web下项目会发布到IDEA的配置文件夹中。具体路径如下:

Using CATALINA_BASE: "C:\Users\用户名\.IntelliJIdea2018.2(IDEA配置目录)\system\tomcat\Unnamed_项目名"

Using CATALINA_HOME: "D:\MySoft\apache-tomcat-8.5.29"

Using CATALINA_TMPDIR: "D:\MySoft\apache-tomcat-8.5.29\temp"

Using JRE_HOME: "D:\MySoft\Java\jdk1.8.0_171"

Using CLASSPATH: "D:\MySoft\apache-tomcat-8.5.29\bin\bootstrap.jar;D:\MySoft\apache-tomcat-8.5.29\bin\tomcat-juli.jar"其实和将war包放入tomcat的webapp目录idea自动编译设置,没有任何功能上的区别!

资源文件和class的热更新就是文件替换!而java class的热加载,是tomcat(满足servlet标准的web容器都支持)自身的功能idea自动编译设置。

在tomcat

server.xml

中可以自己指定 autoDeploy="true" 是否开关,如果关闭,就不支持热部署了idea自动编译设置。每次修改class都需要重启,但是修改资源文件不需要,因为资源文件不用加载到内存中,只是需要时才加载。

上图四个选项:1.update resources 更新变动的资源文件 2. update classes and resources 更新变动的class和资源文件 3. redeploy class和资源文件全部更新 4. 重启tomcat

另外:

eclipse和idea在部署web应用这一块做法几乎完全相同idea自动编译设置,但是一些配置行为不同,并且部署的目录在工作空间的

.metadata

里idea自动编译设置。

2. IDEA插件带来的热加载

1)Settings->Build project automatically

这个设置就是将class自动编译到普通项目的bin目录,或者maven项目的target目录中,不论从外部servlet容器还是嵌入式容器,只要启动就需要tomcat、jetty等servlet容器开启热部署,如果没有开起,依然不能使用热部署idea自动编译设置。

2)spring-boot-devtools

这个是springboot项目中使用的插件,在项目启动后,会默认启动一个线程,监视工作空间或者target中,发生文件改动就即时更新idea自动编译设置。

3. 简单阐述原理

资源文件都是在需要时读取,所以热更新直接就能替换,主要是java类的热更新idea自动编译设置。

双亲委派机制双亲委派模型的过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个 类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请 求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完全这个加载请求时,子 加载器才会尝试自己去加载idea自动编译设置。 (某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给 父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完 成此加载任务时,才自己去加载。)沙箱机制沙箱机制是由基于双亲委派机制上 采取的一种JVM的自我保护机制,假设你要写一个java.lang.String 的类,由于双亲委派机制的原理,此请求会先交给Bootstrap试图进行加载,但是Bootstrap在加载类时首 先通过包和类名查找rt.jar中有没有该类,有则优先加载rt.jar包中的类,因此就保证了java的运行机制不 会被破坏.双亲委派机制+沙箱机制(防止恶意代码对java的破坏Java类加载器种类1. Bootstrap类加载器 - $JAVA_HOME/jre/lib/rt.jar2. Ext类加载器 - $JAVA_HOME/jre/lib/ext/*.jar3. System(或者AppClassLoader)类加载器 - $CLASSPATHAppClassLoader 应用类加载器在最下面,中间是 ExtClassLoader拓展类加载器,最上面是BootstrapClassLoader 启动类加载器。(三者之 间是父子关系)上面还有一点,就是类加载器都是sun.misc.Launcher开头的,sun.misc.Launcher它是一个java虚 拟机的入口应用

上面说的只是说idea自动编译设置,系统类不能被冒充,但是还是能再次加载的!(网上所有说,例如可以在自己的项目里简历

java.lang.String

能替换jdk的String的idea自动编译设置,都是错误的)

也就是说idea自动编译设置,我们要实现热更新、热部署、热加载,只要实现自己的类加载器,去约定好的路径加载class,就完全能实现自己的热部署插件!

4. 解决问题

idea的热加载怎么实现的idea自动编译设置?

java双亲委派机制,一个类已经加载,还能重新加载覆盖吗?如不能是怎么实现热加载IDEA的热加载是通过复制文件到tomcat的映射webapp中,让tomcat自动部署,或者是springboot项目发布文件到target目录中,让嵌入式serlvet容器自动部署,究其原理是Java语言的类加载机制(类加载机制会使用双亲委派原则) idea自动编译设置。

一个类被加载到内存中,能够被覆盖idea自动编译设置。

结束idea自动编译设置。

本文TAG:加载实现怎么idea

最新文章
热门文章
标签列表
Zen Cart 中文版