赞
踩
原文网址:SpringBoot--热部署--方案_IT利刃出鞘的博客-CSDN博客
说明
本文介绍SpringBoot的热部署方案。
热部署概述
每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。
原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader。在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
主要有以下几种热部署方式
原理
(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
测试
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的内容就会进行热部署。
在 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的端口无法关闭,必须打开任务管理器进行对该进程干掉)
以下无法热部署:
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
见:Idea系列--插件_feiying0canglang的博客-CSDN博客
springboot实现热部署_米奇罗-CSDN博客_springboot热部署
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。