在SpringBoot开发调试中,如果我每修改一行代码都需要重启调试,可能会比较耗时;SpringBoot团队针对该问题提供了spring-boot-devtools(简称devtools)插件,试图提高开发调试效率。@pdaiSpringBoot开发-什么是热部署和热重载?devtool的原理是什么?准备知识点什么是热部署和热加载?什么是活载?配置devtools实现热部署POM配置IDEA配置application.yml配置使用LiveLoad进一步了解devtools的原理?为什么会自动重启?devtool会打包成Jar吗?为什么devtool默认禁用缓存选项?devtool可以对所有的Springboot应用进行全局配置吗?如果我不使用devtools,我有什么选择?实例源码参考文章准备知识点什么是热部署和热加载?热部署和热加载是在应用程序运行时自动更新(重新加载或替换类等)应用程序的能力。(PS:spring-boot-devtools提供的解决方案也是需要重启的,但是可以自动加载,不需要手动重启。)严格来说,我们需要区分热部署和热加载。对于Java项目:热部署在服务器运行时,重新部署项目直接重新加载整个应用。这种方式会释放内存,比热加载更干净彻底,但是也比较耗时。热重新加载在运行时重新加载类,从而升级应用程序。热加载的实现原理主要依赖于java的类加载机制。实现方式可以概括为在容器启动的时候启动一个后台线程,定时检测class文件的时间戳变化。如果类的时间戳发生变化,则类重新加载。与反射机制相比,反射是在运行时获取类信息,通过动态调用改变程序行为;热加载是通过在运行时重新加载来改变类信息,直接改变程序行为。什么是活载?LiveLoad是一个提供浏览器客户端自动加载和更新的工具。分为两部分:LiveLoad服务端和Liveload浏览器插件;devtools已经集成了LiveLoadserver,所以如果我们开发一个web应用,希望浏览器自动刷新,这个时候可以考虑这个LiveLoad。同一时间只能运行一个LiveReload服务器。在启动应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序支持LiveReload。配置devtools实现热部署我们使用如下配置实现自动重启方式的热部署。POM配置添加spring-boot-devtools依赖org.springframework.bootspring-boot-devtoolstrueIDEA配置如果你使用IDEA开发工具,通常有两种方式:方式一:没有配置时,手动触发重启更新(Ctrl+F9)(也可以使用mvncompile触发重启更新)方法二:IDEA需要开启运行时编译,自动重启更新设置一:File->Setting->Build,Execution,Deployment->CompileCheck:Makeprojectautomaticallysetting2:快捷键:ctrl+alt+shift+/选择:Registrycheck:compiler.automake.allow.when.app.running新版IDEA可以先在File->setting->AdvancedSettingsAsetting:application.yml配置spring:devtools:restart:enabled:true#设置开启热部署additional-paths:src/main/java#重启目录exclude:WEB-INF/**thymeleaf:cache:false#使用Thymeleaf模板引擎,使用LiveLoad关闭缓存spring-boot-devtools模块包含一个嵌入式LiveReload服务器,可用于在资源更改时触发浏览器刷新。LiveReload浏览器扩展支持Chrome、Firefox和Safari,您可以从livereload.com免费下载。或从浏览器插件中心下载,如firefox:安装后,可通过如下图标进行管理。如果不想在应用程序运行时启动LiveReload服务器,可以将spring.devtools.livereload.enabled属性设置为false。一次只能运行一个LiveReload服务器。在启动应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序支持LiveReload。进一步理解虽然有些开发者会使用devtool工具,但能深入理解的却寥寥无几;让我们了解以下问题,以帮助您进一步了解。@pdaidevtool的基本原理是什么?为什么会自动重启?为什么也重启应用,为什么不手动重启,而是建议使用spring-boot-devtools进行热部署重启?spring-boot-devtools使用了两个类加载器ClassLoader,一个ClassLoader加载不会改变的类(第三方jar包),另一个ClassLoader(重启ClassLoader)加载会改变的类(自定义类)。文件监控线程(FileWatcher)在后台启动。当被监控目录下的某个文件发生变化时,原来重启的ClassLoader会被丢弃,重新加载一个新的重启ClassLoader。因为文件更改后,不再重新加载第三方jar包,只加载自定义的类,而且加载的类会更少,所以重启会更快。这是为什么,同样是重启应用,为什么不手动重启,推荐使用spring-boot-devtools进行热部署重启。自动重启有几点需要注意:自动重启会记录日志(记录什么情况下重启日志)可以通过以下spring关闭:devtools:restart:log-condition-evaluation-delta:false排除一些不必要的自动重启资源有些资源在发生变化时不一定需要触发重启。默认情况下,更改/META-INF/maven、/META-INF/resources、/resources、/static、/public或/templates中的资源不会触发重启,但会触发实时重新加载。如果要自定义这些排除项,可以使用spring.devtools.restart.exclude属性。例如,要仅排除/static、/public,您可以设置以下属性:spring:devtools:restart:exclude:"static/**,public/**"如果要保留这些默认值并添加其他排除项,请使用取而代之的是spring.devtools.restart.additional-exclude属性。自定义重启类加载器重启功能是通过使用两个类加载器实现的。对于大多数应用程序,这种方法效果很好。但是,它有时会导致类加载问题。默认情况下,IDE中任何打开的项目都使用“restart”类加载器加载,任何常规.jar文件都使用“base”类加载器加载。如果您正在处理一个多模块项目并且不是每个模块都导入到您的IDE中,您可能需要自定义一些东西。为此,您创建一个META-INF/spring-devtools.properties文件。spring-devtools.properties文件可以包含以restart.exclude和restart.include为前缀的属性。include元素是应该上拉到“restart”类加载器的项,exclude元素是应该下推到“Base”类加载器的项。此属性的值是应用于类路径的正则表达式模式,如以下示例所示:restart:exclude:companycommonlibs:"/mycorp-common-[\\w\\d-\\.]+\\.jar"包括:projectcommon:"/mycorp-myproj-[\\w\\d-\\.]+\\.jar"更多信息可以在这里找到。devtool会打包成Jar吗?devtool原则上应该只在开发和调试时使用,而在生产环境运行jar包时不需要,那么Spring会不会打包成JAR呢?默认情况下,当运行未打包到JAR中的打包应用程序时,开发人员工具会自动禁用。如果通过java-jar或其他特殊的类加载器启动它,它将被视为“生产环境应用程序”。如果我们期望远程调试应用程序(不要在生产环境中使用它,只有在受信任的网络上运行或使用SSL进行保护时才应启用)在这种情况下,devtool还具有远程调试的能力:远程客户端应用程序程序旨在从您的IDE中运行。您需要org.springframework.boot.devtools.RemoteSpringApplication使用与您要连接的远程项目相同的类路径来运行。应用程序唯一需要的参数是它连接到的远程URL。例如,如果使用Eclipse或Spring工具,并且您有一个名为my-app的项目部署到CloudFoundry,请执行以下操作:从“运行”菜单中选择“运行配置...”。创建一个新的Java应用程序“启动配置”。浏览my-app项目。使用org.springframework.boot.devtools.RemoteSpringApplication作为主类。将https://myapp.cfapps.io添加到程序参数(或任何您的远程URL)。一个正在运行的远程客户端可能类似于以下列表:||'_\/_`||_\_________||____\\\\\/___)||_)|||||||(_|[]::::::[]/-_)'\/_\_/-_)))'|____|.__|_||_|_||_\__,||_|_\___|_|_|_\___/\__\___|////=========|_|================|___/======================================/_/_/_/::SpringBoot远程::2.5.42015-06-1018:25:06.632INFO14938---[main]o.s.b.devtools.RemoteSpringApplication:在PID为14938的pwmbp上启动RemoteSpringApplication(/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring-boot-devtools/target/classesstartedbypwebbin/Users/pwebb/projects/spring-boot/code)2015-06-1018:25:06.671INFO14938---[main]s.c.a.AnnotationConfigApplicationContext:刷新org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6:启动日期[WedJun1018:25:06PDT2015];上下文层次结构的根2015-06-1018:25:07.043WARN14938---[main]o.s.b.d.r.c.RemoteClientTheConfigurationto:http//localhost:8080是不安全的。您应该使用以“https://”开头的URL。2015-06-1018:25:07.074INFO14938---[main]o.s.b.d.a.OptionalLiveReloadServer:LiveReload服务器正在端口357292015-06-1018:25上运行:07.130INFO14938---[main]o.s.b.devtools.RemoteSpringApplication:在0.74秒内启动RemoteSpringApplication(运行1.105的JVM)为什么devtool默认禁用缓存选项?SpringBoot支持的一些库使用缓存来提高性能。例如,模板引擎缓存编译后的模板,避免重复解析模板文件。此外,SpringMVC可以在提供静态资源时将HTTP缓存标头添加到响应中。虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,阻止您看到您刚刚在应用程序中所做的更改。为此,spring-boot-devtools默认禁用缓存选项。例如Thymeleaf提供了spring.thymeleaf.cache来设置模板引擎的缓存。使用spring-boot-devtools模块时,不需要手动设置这些属性,因为spring-boot-devtools会自动设置。那么自动设置了哪些配置呢?你可以在DevToolsPropertyDefaultsPostProcessor类中找到对应的默认配置。公共类DevToolsPropertyDefaultsPostProcessor实现EnvironmentPostProcessor{static{Mapproperties=newHashMap<>();properties.put("spring.thymeleaf.cache","false");properties.put("spring.freemarker.cache","false");properties.put("spring.groovy.template.cache","false");properties.put("spring.mustache.cache","false");properties.put("server.servlet.session.persistent","true");properties.put("spring.h2.console.enabled","true");properties.put("spring.web.resources.cache.period","0");properties.put("spring.web.resources.chain.cache","false");properties.put("spring.template.provider.cache","false");properties.put("spring.mvc.log-re已解决异常”,“真”);properties.put(“server.error.include-binding-errors”,“ALWAYS”);properties.put(“server.error.include-message”,“ALWAYS”);properties.put("server.error.include-stacktrace","ALWAYS");properties.put("server.servlet.jsp.init-parameters.development","true");properties.put("spring.reactor.debug","true");PROPERTIES=Collections.unmodifiableMap(properties);}当然,如果你不想应用的属性默认由spring-boot-devtools设置,可以通过spring.devtools.add-propertiestofalseinyourapplication.ymldevtools可以为所有的Springboot应用配置全局设置吗?你可以通过在$HOME/.config/spring-boot中添加spring-boot-devtools.yml文件来配置全局devtools设置目录。添加到这些文件的任何属性都适用于您机器上使用devtools的所有SpringBoot应用程序。例如,要将重启配置为始终使用触发器文件,您需要将以下属性添加到您的spring-boot-devtools文件中:spring:devtools:restart:trigger-file:".reloadtrigger"如果我??不使用devtools,有什么选择?如果我不使用devtools,我有什么选择?在实际开发过程中,我不会使用devtool工具,因为:devtool本身是基于restart方式的,这仍然不是真正的热替换方案,JRebel是(收费的)开发调试最重要的是一个如果自动重启的开销和手动重启相差不大,那么还是手动重启(按需重启)比较好。大多数情况下,如果是方法内部的修改或者静态资源的修改,可以在IDEA中通过Rebuild(Ctrl+Shift+F9)进行热更新。另外还有一个工具springloaded,可以实现修改类文件的热部署。详情参见其github地址上的说明。示例源码https://github.com/realpdai/t...参考文章https://docs.spring.io/spring...https://liayun.blog.csdn.net/...更多说告别碎片化学习,没有套路一站式系统学习后端开发:Java全栈知识体系(https://pdai.tech)