Spring Boot集成spring-boot-devtools开发时实现热部署的方式
热部署是什么
大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的class文件,这个文件里记录着和代码等对应的各种信息,然后class文件将被虚拟机的classloader加载。
而热部署正是利用了这个特点,它监听到如果有class文件改动了,就会创建一个新的claassloader进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。
类加载机制
java中的类经过编译器可以把代码编译为存储字节码的class文件,该class文件存储了各种信息,最终要加载到虚拟机中运行使用。类加载机制(摘自《深入理解 java 虚拟机》)虚拟机把描述类的数据从class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。
spring boot实现热部署
spring boot实现热部署有如下方式:
- 使用 spring loaded
- 使用
spring loaded
这种方式是以maven插件的形式去加载,所以启动时使用通过maven命令mvn spring-boot:run
启动,而通过application.run方式启动的会无效,因为通过应用程序启动时,已经绕开了maven插件机制。
pom集成方式:
<build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> <dependencies> <dependency> <groupid>org.springframework</groupid> <artifactid>springloaded</artifactid> <version>1.2.5.release</version> </dependency> </dependencies> </plugin> </plugins> </build>
spring-boot-devtools
这种方式无论怎么启动应用,都可以达到修改文件后重启应用。
pom集成:
<!-- 热部署模块 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-devtools</artifactid> <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --> </dependency>
集成注意
- 如果发现没有热部署效果,则需要检查ide配置中有没有打开自动编译。
- 如果使用thymeleaf模板引擎,需要把模板默认缓存设置为false
#禁止thymeleaf缓存(建议:开发环境设置为false,生成环境设置为true) spring.thymeleaf.cache=false
1.针对devtools的可以指定目录或者排除目录来进行热部署
#添加那个目录的文件需要restart spring.devtools.restart.additional-paths=src/main/java #排除那个目录的文件不需要restart spring.devtools.restart.exclude=static/**,public/**
设置idea让他实现文件修改自动重启项目
1.找到idea的preferences -> build, execution, deployment -> compiler,勾选build project automatically
2.回到idea正常界面,mac使用快捷键shift+option+command+/,window上的快捷键是shift+ctrl+alt+/,打开registry,勾选
compiler.automake.allow.when.app.runningcompiler.automake.allow.when.app.running
通过以上的设置就可以在不重启服务的情况下加载html,但如果修改java文件,服务在几秒后会自动重启,如果不希望服务重启需要在application.properties或application.yml中添加spring.devtools.reatart.enable=false
总结
以上所述是小编给大家介绍的spring boot集成spring-boot-devtools开发时实现热部署,希望对大家有所帮助