Springboot热部署
SpringBoot包括一组额外的工具,这些工具可以使应用程序开发体验更加愉快。spring-boot-devtools
模块可以包含在任何项目中,以提供额外的开发时特性。要包含DevTools支持,请将模块依赖项添加到您的构建中,如Maven和Gradle的以下清单所示:
Maven
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>
</dependencies>
Gradle
configurations {developmentOnlyruntimeClasspath {extendsFrom developmentOnly}
}
dependencies {developmentOnly("org.springframework.boot:spring-boot-devtools")
}
在运行完整打包的应用程序时,将自动禁用开发工具。如果您的应用程序是从 |
默认情况下,重新打包的档案不包含DevTools。如果您想使用某些远程DevTools功能,则需要禁用 |
缓存
SpringBoot支持的几个库使用缓存来提高性能。例如模板引擎缓存已编译模板,以避免重复解析模板文件。此外,SpringMVC可以在提供静态资源时向响应添加HTTP缓存头。
虽然缓存在生产中非常有益,但它在开发过程中可能会适得其反,从而阻止您看到您刚才在应用程序中所做的更改。因此,Springboot-DevTools默认禁用缓存选项。
缓存选项通常由application.properties
档案。例如,Thymeleaf提供spring.thymeleaf.cache
财产。不需要手动设置这些属性,spring-boot-devtools
模块自动应用合理的开发时间配置。
因为您在开发SpringMVC和SpringWebFlux应用程序时需要更多关于Web请求的信息,所以开发人员工具将启用DEBUG
的日志记录。web
伐木组。这将为您提供有关传入请求、正在处理它的处理程序、响应结果等方面的信息。如果希望记录所有请求详细信息(包括潜在敏感信息),可以打开spring.http.log-request-details
配置属性。
如果不希望应用属性默认值,则可以设置 |
有关DevTools应用的属性的完整列表,请参见DevToolsPropertyDefaultsPostProcessor. |
自动重启
使用spring-boot-devtools
每当类路径上的文件发生更改时,都会自动重新启动。在IDE中工作时,这可能是一个有用的特性,因为它为代码更改提供了一个非常快速的反馈循环。默认情况下,指向文件夹的类路径上的任何条目都会被监视更改。注意,某些资源,如静态资产和视图模板,不需要重新启动应用程序。.
触发重新启动
在DevTools监视类路径资源时,触发重新启动的唯一方法是更新类路径。导致类路径更新的方式取决于您正在使用的IDE。在Eclipse中,保存修改后的文件将导致类路径被更新并触发重新启动。在IntelliJ IDEA中,构建项目(Build -> Build Project
)具有相同的效果。
只要启用了分叉,您也可以使用支持的构建插件(Maven和Gradle)启动应用程序,因为DevTools需要一个独立的应用程序类加载程序才能正常运行。默认情况下,Gradle和Maven在类路径上检测DevTools时会这样做。 |
当与LiveReload一起使用时,自动重新启动工作非常好。参见LiveReload部分关于细节。如果使用JRebel,则禁用自动重新启动以支持动态类重新加载。其他DevTools特性(如LiveReload和PropertyOverrids)仍然可以使用。 |
DevTools依赖于应用程序上下文的关机钩子来关闭它。如果禁用了关机挂钩( |
在决定类路径上的条目是否应该在更改时触发重新启动时,DevTools会自动忽略名为 |
DevTools需要自定义 |
重新启动VS Reload
SpringBoot提供的重新启动技术通过使用两个类加载器来工作。不更改的类(例如,来自第三方JAR的类)被加载到底座类加载器。正在积极开发的类被加载到重新启动类加载器。重新启动应用程序时,重新启动类加载器被丢弃,并创建一个新的类加载器。这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为底座类加载器已经可用并已填充。
如果发现重新启动对应用程序来说不够快,或者遇到类加载问题,则可以考虑重新加载技术,例如贾贝尔来自ZeroTurn的。这些工作是通过在加载类时重写类来完成的,以使它们更易于重新加载。
状态评估中的测井变化
默认情况下,每次应用程序重新启动时,都会记录一个显示条件评估增量的报告。报告显示了在进行更改时对应用程序的自动配置所做的更改,例如添加或删除bean以及设置配置属性。
若要禁用报表的日志记录,请设置以下属性:
spring.devtools.restart.log-condition-evaluation-delta=false
不包括资源
某些资源在更改时不一定需要触发重新启动。例如,Thymeleaf模板可以就地编辑.默认情况下,更改/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-paths
属性配置其他路径以监视更改。您可以使用spring.devtools.restart.exclude
财产前文描述若要控制附加路径下的更改是否触发完全重新启动或活重装.
禁用重新启动
如果不想使用重新启动功能,可以使用spring.devtools.restart.enabled
财产。在大多数情况下,您可以在application.properties
(这样做仍然初始化重新启动类加载器,但它不监视文件更改)。
如果你需要完全地禁用重新启动支持(例如,因为它不适用于特定的库),您需要设置spring.devtools.restart.enabled
System
财产false
在打电话之前SpringApplication.run(…?)
,如以下示例所示:
public static void main(String[] args) {System.setProperty("spring.devtools.restart.enabled", "false");SpringApplication.run(MyApp.class, args); }
使用触发器文件
如果您使用持续编译更改文件的IDE,则可能希望只在特定时间触发重新启动。为此,您可以使用“触发器文件”,这是一个特殊的文件,当您想要实际触发重新启动检查时,必须修改该文件。更改文件只会触发检查,只有在DevTools检测到必须做什么时才会重新启动。触发器文件可以手动更新,也可以使用IDE插件更新。
若要使用触发器文件,请将spring.devtools.restart.trigger-file
属性设置为触发器文件的路径。
你可能想要设置 |
自定义重新启动类加载程序
如前面所述,重新启动VS Reload节中,重新启动功能是通过使用两个类加载器实现的。对于大多数应用程序来说,这种方法工作得很好。但是,它有时会导致类加载问题。
默认情况下,IDE中的任何打开项目都带有“重新启动”类加载器和任何常规的类加载器。.jar
使用“基本”类加载器加载文件。如果您在一个多模块项目上工作,而且不是每个模块都导入到您的IDE中,那么您可能需要定制一些东西。为此,您可以创建一个META-INF/spring-devtools.properties
档案。
这,这个,那,那个spring-devtools.properties
文件可以包含以restart.exclude
和restart.include
。这,这个,那,那个include
元素是应该拖放到“重新启动”类加载器中的项,并且exclude
元素是应该向下推到“基本”类加载器中的项。属性的值是应用于类路径的regex模式,如下面的示例所示:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
所有属性键必须是唯一的。只要财产开始于 |
全 |
已知限制
重新启动功能不能很好地处理使用标准反序列化的对象。ObjectInputStream
。如果需要反序列化数据,则可能需要使用Spring的ConfigurableObjectInputStream
结合在一起Thread.currentThread().getContextClassLoader()
.
不幸的是,一些第三方库在不考虑上下文类加载器的情况下反序列化.如果发现这样的问题,则需要向原始作者请求修复。
LiveReload
这,这个,那,那个spring-boot-devtools
模块包括嵌入式LiveReload服务器,该服务器可用于在资源更改时触发浏览器刷新。LiveReload浏览器扩展可以免费提供给Chrome、Firefox和Safarilivereload.com.
如果不希望在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled
财产false
.
一次只能运行一个LiveReload服务器。在启动应用程序之前,请确保没有其他LiveReload服务器正在运行。如果您从IDE启动多个应用程序,那么只有第一个应用程序具有LiveReload支持。 |
全球设置
可以通过添加名为.spring-boot-devtools.properties
敬你的$HOME
文件夹(请注意文件名以“.”开头)。添加到此文件的任何属性都应用于全使用DevTools的机器上的SpringBoot应用程序。例如,要将重新启动配置为始终使用触发文件,您将添加以下属性:
~/.Spring-boot-devtools.properties。
spring.devtools.reload.trigger-file=.reloadtrigger
远程应用程序
SpringBootDeveloper工具并不局限于本地开发。在远程运行应用程序时,还可以使用几个特性。远程支持是可选的。要启用它,您需要确保devtools
包含在重新打包的归档中,如下面的清单所示:
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludeDevtools>false</excludeDevtools></configuration></plugin></plugins>
</build>
然后,您需要设置一个spring.devtools.remote.secret
属性,如以下示例所示:
spring.devtools.remote.secret=mysecret
使能 |
远程DevTools支持分为两部分:接受连接的服务器端点和在IDE中运行的客户端应用程序。控件时自动启用服务器组件。spring.devtools.remote.secret
属性设置。必须手动启动客户端组件。
运行远程客户端应用程序
远程客户端应用程序设计为在IDE中运行。你得跑org.springframework.boot.devtools.RemoteSpringApplication
具有与所连接的远程项目相同的类路径。应用程序唯一需要的参数是它所连接的远程URL。
例如,如果您正在使用Eclipse或STS,并且您有一个名为my-app
您已经部署到CloudFoundry,您将执行以下操作:
- 选择
Run Configurations…?
从Run
菜单。 - 创建一个新的
Java Application
“发射配置”。 - 浏览
my-app
项目。 - 使用
org.springframework.boot.devtools.RemoteSpringApplication
作为主修班。 - 加
https://myapp.cfapps.io
到Program arguments
(或者不管您的远程URL是什么)。
正在运行的远程客户端可能类似于以下清单:
. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /=========|_|==============|___/===================================/_/_/_/:: Spring Boot Remote :: 2.1.0.RELEASE2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)
2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
由于远程客户端使用的类路径与实际应用程序相同,因此可以直接读取应用程序属性。这就是为什么 |
使用总是明智的。 |
如果需要使用代理访问远程应用程序,请配置 |
20.5.2远程更新
远程客户端监视应用程序类路径的更改,方式与局部重启。任何更新的资源都被推送到远程应用程序中,并且(如有需要)触发重新启动。如果您在使用本地没有的云服务的特性上进行迭代,这可能会很有帮助。通常,远程更新和重新启动要比完整的重建和部署周期快得多。
只有在远程客户端运行时才监视文件。如果在启动远程客户端之前更改文件,则不会将其推送到远程服务器。 |