关于SpringBoot的热部署方案

 更新时间:2023年05月19日 10:36:25   作者:IT利刃出鞘  
这篇文章主要介绍了关于SpringBoot的热部署方案,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本,本文就来详解热部署方案,需要的朋友可以参考下

简介

说明

本文介绍SpringBoot的热部署方案。

热部署概述

每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。

原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader。在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

主要有以下几种热部署方式

  • spring-boot-devtools(适合开发环境)
  • springloaded(maven插件)配置pom.xml文件,使用mvn spring-boot:run启动
  • springloaded本地加载启动,配置jvm参数:-javaagent:<jar包地址> -noverify(适合生产环境)
  • JRebel(收费)

spring-boot-devtools

原理

(1) devtools可以实现这三种热部署:页面热部署、类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。 devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。

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

使用

1.pom.xml添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>2.0.4.RELEASE</version>
    <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
    <scope>true</scope>
</dependency>

2. pom.xml添加maven插件。(必须配置<fork>true</fork>)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
                <!--如果没有这个属性 springBoot 自动配置不会生效-->
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

3. 修改application.yml

spring:
  devtools:
    restart:
      enabled: true  #开启热部署
      additional-paths: src/main/java #重启目录
      exclude: WEB-INF/**
  freemarker:
    cache: false    #页面不加载缓存,修改即时生效

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

4. 设置Idea软件

File=>Settings=> Builder,Execution,Deployment=> Compiler=> 选中“Build project automaticlly”

ctrl+shift+alt+/ =>选择registry=>找到 compiler.automake.allow.when.app.running 并✔

5.如果使用 Thymeleaf 模板引擎,需要把模板默认缓存设置为 false

修改application.properties为false:

#禁止thymeleaf缓存(建议:开发环境设置为false,生产环境设置为true )
spring.thymeleaf.cache=false

测试

  • 修改类=>保存:应用会重启
  • 修改配置文件=>保存:应用会重启。例如:application.yml,log4j.yml。若想这些配置文件不热部署,这样做:spring.devtools.restart.exclude=application.properties
  • 修改页面=>保存:应用不会重启,但会重新加载,页面会刷新

Intellij IEDA和Eclipse不同,Eclipse设置了自动编译之后,修改类它会自动编译,而IDEA在非RUN或DEBUG情况下才会自动编译(前提是你已经设置了Auto-Compile)。

修改多个文件的解决方法

如果你写一个逻辑代码,需要好几个文件,总不能你每保存一次就进行一次热部署。解决方法:

在application.properties添加手工触发重启

#通过触发器,去控制什么时候进行热加载部署新的文件
spring.devtools.restart.trigger-file=trigger.txt

在src\main\resources目录下,添加trigger.txt文件

version=1

这样你每次改好代码,不会每次保存就热部署,而是改好代码后,改trigger.txt的内容就会进行热部署。

springloaded(maven插件)

在 spring-boot-maven-plugin 插件配置中添加 springloaded 依赖

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <dependencies>
                <!-- 该依赖在此处下载不下来,可放在build标签外部下载完成后再粘贴进plugin中 -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                    <version>1.2.5.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

配置Idea使用MVN运行(也可以在项目所在路径下打开dos,输入mvn spring-boot:run,然后回车)

Run=> Edit Configurations=> 左上角“+”号=> 选择MAVEN=> Name:为本命令命名; Working Directory:指定要运行的项目路径;Command line:spring-boot:run

IDEA项目运行部位出现此配置,点击绿色箭头运行即可

当前springboot的端口无法关闭,必须打开任务管理器进行对该进程干掉)

以下无法热部署:

对于一些第三方的注解修改不能自动加载,比如spring mvc的@RequestMappingapplication.properties的修改也不行log4j的配置文件的修改不能即时生效

springloaded本地加载启动

1.下载springloaded:https://github.com/spring-projects/spring-loaded

2.Run=> Edit Configurations=>SpringBoot=> Application=> Configuration=> VM options=> 输入:-javaagent:<jar包地址> -noverify 例如:

-javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify

到此这篇关于关于SpringBoot的热部署方案的文章就介绍到这了,更多相关SpringBoot热部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot+redis实现微博热搜排行榜的示例代码

    springboot+redis实现微博热搜排行榜的示例代码

    本文主要介绍了springboot+redis实现微博热搜排行榜的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java中BufferedReader与Scanner读入的区别详解

    Java中BufferedReader与Scanner读入的区别详解

    这篇文章主要介绍了Java中BufferedReader与Scanner读入的区别详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java Pattern与Matcher字符串匹配案例详解

    Java Pattern与Matcher字符串匹配案例详解

    这篇文章主要介绍了Java Pattern与Matcher字符串匹配案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 谈谈Java利用原始HttpURLConnection发送POST数据

    谈谈Java利用原始HttpURLConnection发送POST数据

    这篇文章主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧
    2015-10-10
  • Java中的Random和ThreadLocalRandom详细解析

    Java中的Random和ThreadLocalRandom详细解析

    这篇文章主要介绍了Java中的Random和ThreadLocalRandom详细解析,Random 类用于生成伪随机数的流, 该类使用48位种子,其使用线性同余公式进行修改,需要的朋友可以参考下
    2024-01-01
  • 关于String.format使用详解

    关于String.format使用详解

    文章介绍了Java中String.format的使用,通过格式说明符实现简洁、可维护的字符串拼接,适用于日志生成、数据格式化、编号处理等场景,支持灵活的格式控制与null值处理,显著提升代码可读性和灵活性
    2025-08-08
  • java中static的用法及注意点

    java中static的用法及注意点

    在本篇文章里小编给大家整理的是一篇关于java中static的用法及注意点,有兴趣的朋友们可以学习下。
    2021-03-03
  • Spring Security注册过滤器注意事项详解

    Spring Security注册过滤器注意事项详解

    前两天和小伙伴聊了 Spring Security+JWT 实现无状态登录,然后有小伙伴反馈了一个问题,感觉这是一个我们平时写代码容易忽略的问题,所以本文给大家介绍了Spring Security注册过滤器注意事项,需要的朋友可以参考下
    2024-06-06
  • VsCode配置java环境的详细图文教程

    VsCode配置java环境的详细图文教程

    vscode是一个免费的代码编辑器,支持多种主题,应用起来简单方便,下面这篇文章主要给大家介绍了关于VsCode配置java环境的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • IDEA如何查看代码反汇编代码

    IDEA如何查看代码反汇编代码

    这篇文章主要介绍了IDEA如何查看代码反汇编代码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论