Springboot提供了一套额外的工具,可以让你更加愉快的开发应用,spring-boot-devtools模块可以包含在任何项目中,以在开发期间提供一些有用的特性。要使用devtools,添加一i下依赖到项目中。
org.springframework.boot spring-boot-devtools
true
- 如果你的应用程序时通过 java -jar启动的,或者时一个特殊的classloader启动的,那么它就被认为是一个“生产级别的应用程序”,开发者工资会被自动禁用。你可以通过【spring.devtools.restart.enabled】配置属性来控制这一行为。要启用devtools,无论用于启动应用程序的类加载器是什么,请设置情动参数 【-Dspring.devtools.restart.enabled=true】在生产环境中不能这样做,因为运行devtools会有安全风险。要金庸devtools,请删除该依赖或者设置启动参数【-Dspring.devtools.restart.enabled=false】。
- 应该在Maven中把这个scope标记为optional,或在Gradle中使用developmentOnly配置。以防止使用你的项目的替他模块,传递地依赖了devtools
- 重新打包的压缩文件默认不包含devtools。如果你想使用某个远程devtool功能,你需要包含它,使用Maven插件时,将excludeDevtools属性设为false。
1. 诊断类加载问题
重启共嫩南瓜时通过使用两个classloader实现的。对于大多数应用程序来说,这总方法效果很好,然而,他有时会导致类加载问题,特别时在多模块项目中。
为了诊断加载问题是否确实是由devtools和它的 两个类加载器引起的,请试着金庸restart。如果这能解决你的问题,请定制restart类加载器以包括你的整个项目。
2. 属性的默认值
在springboot支持的一些库中,会使用缓存来提高性能。例如,模板引擎会缓存已编译的模板,以避免重复解析模板文件。另外,Sping MVC可以在响应静态资源时往响应总添加HTTP缓存头。
虽然缓存在生产中非常有益,但在开发过程中可能会产生反作用,使你无法看到你在应用程序中刚做的改动。由于这个原因【spring-boot-devtools】默认仅用了缓存选项。
缓存的选项通常时通过application.yml文件中的属性来配置的。例如,thymeleaf提供了spring.thymeleaf.cache[]属性,与其需要手动设置这些属性,spring-boot-devtools模块会在开发场景下合理的设置这些属性。
下表列出了所有被设置的属性:
Name Default Value server.error.include-binding-errors
always
server.error.include-message
always
server.error.include-stacktrace
always
server.servlet.jsp.init-parameters.development
true
server.servlet.session.persistent
true
spring.docker.compose.readiness.wait
only-if-started
spring.freemarker.cache
false
spring.graphql.graphiql.enabled
true
spring.groovy.template.cache
false
spring.h2.console.enabled
true
spring.mustache.servlet.cache
false
spring.mvc.log-resolved-exception
true
spring.reactor.netty.shutdown-quiet-period
0s
spring.template.provider.cache
false
spring.thymeleaf.cache
false
spring.web.resources.cache.period
0
spring.web.resources.chain.cache
false
如果你不希望设置属性的默认值,你可以在你的application.yml中把spring.devtools.add-properties 设置为false。
在开发Spring MVC和Spring WebFlux应用程序时,你可能需要更多关于Web请求的信息,开发者工具建议你为Web日志组启用DEBUG日志。这将给你提供客户端的请求信息,哪个handler正在处理它,响应结果,以及其他细节。如果你希望记录所有的请求细节,可以打开【spring.mvc.log-request-details[]】 或 【spring.codec.log-request-details[]】 配置。
3. 自动重启
使用spring-boot-devtools的应用程序会在classpath上的文件发生变化时自动重启。当在IDE中工作时,这可能是一个有用的功能,因为它为代码变化提供了一个非常快速的反馈。默认情况下,classpath上任何指向目录的条目都会被检测到变化。注意,某些资源,如静态资源和视图模板发生变化时,不需要重启应用程序。
触发重启
由于DevTools监控classpath资源,触发重启的唯一方法时更新classpath。无论你使用的是IDE还是构建插件,被修改的文件都必须被重新编译以触发重启。导致更新classpath的方式取决于你所使用的工具。
- 在Eclipse中,保存一个修改过的文件会导致classpath被更新并触发重启。
- 在InteliJ IDEA中,构建项目(Build → Build Project)有同样的效果。
- 如果使用构建插件,运行Maven的【mvn compile】会触发重启。
重启 vs 重载
Spring boot通过两个类加载器实现了重启。不变的类(例如,来自第三方jar的类)被加载到一个base classloader。你正在开发的类被加载到 restart classloaderr中。当应用程序被重新启动时,restart classloader被丢弃,并被创建一个新的。这种方法以为着应用程序的重启通常比“冷启动”快得多,因为base classloader已经可用并被填充。
如果你发现重启对你的应用程序来说不够快,或者你遇到了类加载相关问题,你可以考虑重载技术,工作原理是在类被加载时对其进行重写,使其更容易重载。
3.1 记录条件评估的变化
默认情况下,每次你的应用程序重新启动时,都会记录一份显示条件评估delta的报告。该报告显示了你的应用程序的自动配置的变化,因为你做了一些改变,如添加或删除Bean和设置配置属性。
要禁用报告的记录,请设置一下属性yaml
spring:
devtools:
restart:
log-condition-evaluation-delta: false
3.2 排除资源
某些资源在被改变时不一定需要触发重启。例如,thymeleaf模板可以就地编辑。默认情况下,改变/META-INF/maven, /META-INF/resources, /resources, /static, /public, /templates中资源不会触发重启,但会触发实时重载。如果你想自定义这些排除项,可以使用spring.devtools.restart.exclude属性。例如,要只排除 /static 和 /public,你可以设置一下属性。
yaml
spring:
devtools:
restart:
exclude: "static/**,public/**"
3.3 监控额外的路径
当你不在classpath上的文件进行修改时,你可能希望你的应用程序被重新启动或重新加载。为此,使用【spring.devtools.restart.extra-paths】属性来配置监控变化的额外路径。你可以使用【spring.devtools.restart.excelude】属性来控制额外路径下的变化时触发完全重启还是实时加载。
3.4 禁止重启
如果你不想使用重启功能,你可以通过使用spring.devtools.restart.enabled属性来禁用它。在大多数情况下,你可以在application,yaml中设置这个属性。
如果你需要完全禁用重启支持,你需要在调用SpringApplication.run(...)之前将spring.devtools.restart.enabled属性设置为false。如下面的例子
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication { public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApplication.class, args); } }
3.5 使用trigger file
如果你只想在特定时间触发重启,你可以【trigger file】,这是一个特殊的文件,当你想实际触发重启检查时,那你就对这个文件进行修改。
对文件的任何更新都会触发检查,但只有当devtools检测到它有变动发生时,才会实际重新启动。
通过属性【spring.devtools.restart.trigger-file】设置trigger file文件的名称(不包括任何路径)。trigger file 必须在classpath路径上。
src +- main +- resources +- .reloadtrigger
那么你的【trigger-file】属性应该设置为如下
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
现在只有当 src/main/resources/.reloadtrigger 被更新时才会重新启动。
有些IDE有一些功能,使你不需要手动更新你的触发器文件。Spring Tools for Eclipse和InteliJ IDEA 都有这种支持。对于Spring Tools,你可以使用控制台视图中的reload按钮(需要把你的trigger-file命名为.reloadtrigger)。对于InterliJ IDEA,你可以按照其文档中的说明进行操作。
3.6 自定义重启类加载器
正如前面在Restart vs Reload所描述的,重启功能时通过使用两个classloader实现的。如果这导致了其他的问题,你可能徐娅自定义类加载器。
默认情况下,你的IDE中任何打开的项目都是用“restart”类记载器加载的,而任何常规的.jar 文件都是用 base 类加载器加载。如果你使用【mvn spring-boot:run】或【gradle bootRun】也是一样,包含了@SpringBootApplication的项目用 restart 类加载器加载,其他都用 base 类加载器。
你可以通过创建 META-INF/spring-devtools.properties 文件来指定 Spring Boot 用不同的类加载器来加载你的项目的不同部分。【spring-devtools.properties】文件可以包含以 restart.exclude 和 restart.include 开通的属性。 include元素是应该被拉大 restart 类夹在其中的项目,而exclude元素是应该被推到base类加载器中的项目。该属性的值是一个基于classpath的正则表达式,如以下
restart:
exclude:
companycommonlibs: "/mycorp-common-[\\w\\d-\\.]+\\.jar"
include:
projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"
4. 全局设置
你可以通过在 $HOME/.config/spring-boot 目录下添加以下文件来配置全局的devtools设置。
- spring-boot-devtools.propertiese
- spring-boot-devtools.yaml
- spring-boot-devtools.yml
添加到这些文件中的任何属性都适用于你机器上使用devtools的所有Spring Boot应用程序。例如,如果要将重启配置为总是使用trigger file,你可以在spring-boot-devtools文件中添加以下属性。
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
5. 配置热部署
5.1 在pom.xml中添加依赖
org.springframework.boot spring-boot-devtools
runtime 5.2 添加配置信息
#开启热部署
spring.devtools.restart.enabled=true
#热部署重新加载java下面类文件
spring.devtools.restart.additional-paths=src/main/java
#排除静态文件重新部署
spring.devtools.restart.exclude=static/**
5.3 配置setting页面
5.4 Ctrl+Shift+Alt+/
还没有评论,来说两句吧...