在我们修改完项目代码后希望不用重启服务器就能把项目代码部署到服务器中(也就是说修改完项目代码后不用重启服务器修改后的项目代码就能生效)。

一、实现devtools原理

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
</dependency>

        spring-boot-devtools从名称就可以看出来,是开发者工具包,其主要的功能就是实现热加载。其实现原理就是两个ClassLoader,一个负责加载那些不会经常改变的文件,比如:第三方jar包,一旦引入项目之后这部分代码在调试过程中就处于不变的状态;一个负责加载可能经常改变的类,比如我们自己在项目中写的代码,被称为restart ClassLoader。当有代码发生改变的时候,重建一个restart ClassLoader,原有的restart ClassLoader被丢掉。由于每次重新加载的内容较少,所以速度比手动重启更快一些。

二、实现步骤

①、首先,使用:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running” 。

 但是,发现  compiler.automake.allow.when.app.running 并没有找到这个选项。

        原来,在 IDEA 2023 版本这个选项的配置,改到设置-高级设置模块了。ctrl+alt+s,进入设置,然后选择高级设置,在Compiler下勾选 Allow auto-make to restart even if developed application is currently running。,然后再进入 设置 ==> Build,Execution,Deployment ==> Compiler,勾选 Build project automatically。

②、添加这段代码后,重启IDEA ,然后再重启程序应用。

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>  <!--dev-tools相关-->
                    <skip>true</skip>   <!--否则模块打包时候会提示 unable to find main class-->
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

③、实在不行,还可以尝试修改一下application.properties配置(当然一般情况下,不用走到这一步,就可以完成热部署)通常程序运行不生效的原因有两种:

  • JDK编译版本和运行版本不统一,自行学习一下IDEA环境下JDK配置
  • 浏览器缓存或者其他的缓存软件导致的问题
#热加载生效
spring.devtools.restart.enabled=true
#额外新增的热加载目录
spring.devtools.restart.additional-paths= src/main/java
#热加载排除目录
#spring.devtools.restart.exclude= 

④、最后建议你去浏览器插件商店安装一个插件叫做LiveReload。 

         Spring devtools默认会启动一个 Live Reload Server实例监听文件的变化。并实时与浏览器插件通信更新浏览器展示界面。就不用每次更改内容之后都点击浏览器刷新按钮了。

三、补充说明

        最次如果还不行(那就执行手动热加载),我们直接入devtools坐标后将修改后的项目Build(Ctrl+F9)一下,就可以把修改后的项目部署到服务器中了(目的和重启服务器一样了)

当然,如果要关闭热部署的话,可以尝试:

  devtools:
    restart:
      exclude: static/** , public/** ,config/application.yml
      enabled: false
# /** 表示此目录下的所有文件
# config/application.yml 已经具体到哪个目录下的哪个文件

        或者在springboot启动类当中输System.setProperty("spring.devtools.restart.enabled","false");即可关闭热部署功能

@SpringBootApplication
public class Springboot12HotDisplayApplication {
 
    public static void main(String[] args) {
        System.setProperty("spring.devtools.restart.enabled","false");
        SpringApplication.run(Springboot12HotDisplayApplication.class, args);
    }
 
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐