• Idea中SpringBoot项目热部署


    1. 在项目开发中,热部署能给我们带来极大的便利,spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,借助它我们就再也无需手动重启Spring Boot应用,提高开发开发效率。

    2. devtools的原理:
      其底层原理是分别使用了两个ClassLoader来加载动态和静态数据:

    其中一个Classloader加载那些不会改变的类(主要是三方Jar包)。
    另一个ClassLoader加载会更改的类,称为Restart ClassLoader,这样在有代码更改的时候,旧的Restart ClassLoader被丢弃,创建一个新的Restart ClassLoader,由这个新的加载器来加载动态资源,由于需要加载的类相比较少,所以重启较快。

    1. 项目依赖:
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    
    1. 项目配置
    #热部署生效
    spring.devtools.restart.enabled=true
    spring.devtools.livereload.enabled=true
    
    #设置重启的目录
    spring.devtools.restart.additional-paths=src/main/java
    
    #classpath目录下的WEB-INF文件夹内容修改不重启
    spring.devtools.restart.exclude: WEB-INF/**
    

    说明:

    (1) devtools可以实现:

    • 页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现)。
    • 类文件热部署(类文件修改后不会立即生效)。
    • 属性文件的热部署:即devtools会监听classpath下的文件变动。
    • 上述文件保存时会触发重加载(受idea的自动保存动作的延后影响,触发时机可能有所延后),而后才重启应用。因虚拟机实例并未停机,整个重启过程是还很快的(通过查看应用的进程id,与手动重启相比,热加载的进程id不变,证明热加载前后使用的是同一个虚拟机实例)。

    (2)配置了后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。
    devtools的配置

    在application.properties中配置spring.devtools.restart.enabled=false,此时restart类加载器还会初始化,但不会监视文件更新。
    在SprintApplication.run之前调用System.setProperty(“spring.devtools.restart.enabled”, “false”);可以完全关闭热加载功能。

    1. IDEA配置:
      当我们修改了Java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译:
    • File -> Settings -> 勾选Compiler-Build Project automatically。
    • 使用组合热键【ctrl + shift + alt + /】,在弹框中选择Registry,勾选Compiler autoMake allow when app running。
    1. 测试一下:

    修改类–>保存:应用会重启
    修改配置文件–>保存:应用会重启
    修改页面–>保存:应用不会重启,但会重新加载,页面会刷新(原理是将spring.thymeleaf.cache设为false,参考:Spring Boot配置模板引擎)

  • 相关阅读:
    110、抽象基类为什么不能创建对象?
    109、什么情况会自动生成默认构造函数?
    108、如果想将某个类用作基类,为什么该类必须定义而非声明?
    107、类如何实现只能静态分配和只能动态分配
    106、C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?
    hdoj--2036--改革春风吹满地(数学几何)
    nyoj--46--最少乘法次数(数学+技巧)
    vijos--P1211--生日日数(纯模拟)
    nyoj--42--一笔画问题(并查集)
    nyoj--49--开心的小明(背包)
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/12628738.html
Copyright © 2020-2023  润新知