13、开发人员工具
Spring Boot包含一组额外的工具,这些工具可以使应用程序开发体验变的更愉快一些。这些额外的工具可以包含在任何的项目中从而减少你的开发时间。若要包括开发工具支持,请将该模块依赖项添加到项目构建文件中,如下是Maven和Gradle的方式:
- maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
- Gradle
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
运行完全打包的应用程序时,将自动禁用开发人员工具。如果应用程序从启动,或者从特殊类加载器启动,则它被视为"生产应用程序"。如果这不适用于您(即,如果您从容器运行应用程序),请考虑移除 devtools 或设置系统属性。
java -jar
-``Dspring.devtools.restart.enabled=false`
在 Maven 中将依赖项标记为可选,或在 Gradle 中使用自定义"仅开发"配置(如上所示)是一种最佳做法,可以防止 devtools被传递而应用于使用项目的其他模块。
默认情况下,重新打包的存档不包含开发工具。如果要使用某个远程开发工具功能,则需要禁用生成属性以包括它。该属性同时支持 Maven 和 Gradle 插件。
excludeDevtools
13.1、默认属性值
这几个库支持通过Spring Boot 缓存来提高性能,例如,模板引擎缓存已编译的模板,以避免重复分析模板文件。此外,Spring MVC可以在提供静态资源时向响应添加HTTP缓存标头(通过添加响应标头来声明当前模板是否被缓存)
虽然缓存在生产中非常有益,但它在开发过程中可能会适得其反,从而无法看到刚刚在应用程序中所作的更改。因此,Spring Boot启动开发工具默认禁用了缓存选项。
缓存选项通常在文件中进行配置。例如,Thymeleaf提供这个配置。模块无需手动设置这些属性,而是自动应用合理的开发配置。
application.properties` `spring.thymeleaf.cache` `spring-boot-devtools
由于在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,因此开发人员工具将为日志记录组启用日志记录。这将提供有关传入请求、哪个处理程序正在处理它、响应结果等信息。如果您希望记录所有请求详细信息(包括潜在的敏感信息),可以打开配置属性。
DEBUG web spring.http.log-request-details
如果不希望应用属性默认值,可以在
application.properties
中设置为 。spring.devtools.add-properties=false
有关开发工具应用的属性的完整列表,请参阅DevTools 属性防御流程。
13.2 自动重启
每当类路径上的文件发生更改时,使用的应用程序会自动重新启动。在 IDE 中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。默认情况下,监视指向文件夹的类路径上的任何条目的更改。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。
触发重新启动
由于 DevTools 监视类路径资源,因此触发重新启动的唯一方法就是更新类路径。导致类路径更新的方式取决于您使用的 IDE。在 Eclipse 中,保存修改后的文件会导致类路径更新并触发重新启动。在 IntelliJ IDEA 中,构建项目具有相同的效果。Build -> Build Project
如果启用分支,您也可以使用支持的生成插件(Maven 和 Gradle)启动应用程序,因为 DevTools 需要一个隔离的应用程序类加载器才能正常运行。默认情况下,Gradle 和 Maven 在类路径上检测到 DevTools 时会这样做。
与 LiveReload 一起使用时,自动重新启动效果很好。有关详细信息,请参阅实时重新加载部分。如果使用 JRebel,则自动重新启动将被禁用,以选择动态类重新加载。仍可以使用其他开发工具功能(如 LiveReload 和属性重写)。
DevTools 依赖于应用程序上下文的关闭挂钩在重新启动期间关闭它。如果禁用了关机挂钩 ,则无法正常工作。
SpringApplication.setRegisterShutdownHook(false)
在确定类路径上的条目在更改时应触发重新启动时,DevTools 会自动忽略名为
spring-boot
spring-boot-devtools
spring-boot-autoconfigure
和spring-boot-actuator
spring-boot-starter
的项目。
DevTools 需要自定义 的 使用的 。如果应用程序已经提供了一个,它将被包装。不支持直接覆盖
ResourceLoader
ApplicationContext
getResource
ApplicationContext
上的方法。
重新启动与重新加载
Spring Boot 提供的重新启动技术使用两个类加载器工作。不更改的类(例如,来自第三方 jar 的类)将加载到基类加载器中。正在积极开发类将加载到重新启动类加载器中。重新启动应用程序时,将抛出重新启动类加载程序并创建一个新的类加载程序。此方法意味着应用程序重新启动通常比"冷启动"快得多,因为基类加载程序已经可用并填充。
如果您发现重新启动速度不够快,适用于您的应用程序,或者遇到类加载问题,可以考虑重新加载来自ZeroTurnaround的JRebel等技术。这些工作通过重写类,因为它们加载,使他们更容易重新加载。
13.2.1 状态评估中的日志记录更改
默认情况下,每次重新启动应用程序时,将记录显示条件评估增量的报表。此报告显示在进行更改(如添加或删除 bean 以及设置配置属性)时对应用程序的自动配置所做的更改。
若要禁用报表日志记录,请设置以下属性:
spring.devtools.restart.log-condition-evaluation-delta=false
13.2.2 不包括资源
某些资源在更改时不一定需要触发重新启动。例如,可以就地编辑 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-exclude
13.2.3 查看其他路径
当您对不在类路径上的文件进行更改时,您可能希望重新启动或重新加载应用程序。为此,请使用 属性配置其他路径以监视更改。可以使用前面描述的属性来控制其他路径下方的更改是触发完全重新启动还是实时重新加载。spring.devtools.restart.additional-paths``spring.devtools.restart.exclude
13.2.4 禁用重新启动
如果不想使用重新启动功能,可以使用 属性禁用它。在大多数情况下,您可以在spring.devtools.restart.enabled
application.properties
中设置此属性(这样做仍初始化重新启动类加载程序,但它不监视文件更改)。
如果需要完全禁用重新启动支持(例如,因为它不能与特定库一起使用),则需要在系统调用SpringApplication.run(…)
之前将 spring.devtools.restart.enabled
属性设置为false
,如下例所示:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
13.2.5 使用触发器文件
如果使用持续编译已更改文件的 IDE,则可能更喜欢仅在特定时间触发重新启动。为此,可以使用"触发器文件",这是一个特殊的文件,当您想要实际触发重新启动检查时,必须修改该文件。
对文件的任何更新都将触发检查,但仅在 Devtools 检测到它有此功能时才实际重新启动。
若要使用触发器文件,请将 spring.devtools.restart.trigger-file
属性设置为触发器文件的名称(不包括任何路径)。触发器文件必须出现在类路径上的某个地方。
例如,如果您有一个具有以下结构的项目:
src
+- main
+- resources
+- .reloadtrigger
那么您的配置将是:trigger-file
spring.devtools.restart.trigger-file=.reloadtrigger
现在,只有在src/main/resources/.reloadtrigger
更新时才重新启动。
您可能希望设置为全局设置spring.devtools.restart.trigger-file
以便所有项目的行为方式相同。
某些IDE具有可使您无需手动更新触发器文件的功能。Eclipse 和IntelliJ IDEA(终极版)的SpringBoot 工具都有这种支持。使用 Spring Tools,您可以使用trigger-file
.reloadtrigger
控制台视图中的"重新加载"按钮(只要您名为 )。对于 IntelliJ,您可以按照其文档中的说明操作。
13.2.6 自定义重新启动类加载器
如前面在"重新启动与重新加载"部分中所述,使用两个类加载程序实现重新启动功能。对于大多数应用程序,此方法运行良好。但是,它有时可能会导致类加载问题。
默认情况下,IDE 中的任何打开的项目都加载了"重新启动"类加载器,并且任何常规文件都加载了"基"类加载器。如果您处理多模块项目,并且不是每个模块都导入到 IDE 中,则可能需要自定义内容。为此,您可以创建一个文件META-INF/spring-devtools.properties
。
该文件spring-devtools.properties
可以包含restart.exclude
restart.include
前缀和include
exclude
属性。元素是应拉入"重新启动"类加载器的项,元素是应向下推送到"基"类加载器中的项。属性的值是应用于类路径的正则表达式模式,如下例所示:
restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\.]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\.]+\.jar
所有属性键必须是唯一的。只要属性以
restart.include.
或restart.exclude.
开头,即考虑该属性。
从类路径加载所有。您可以将文件
META-INF/spring-devtools.properties
打包到项目内部,也可以打包在项目使用中的库中。
20.2.7 已知限制
重新启动功能不能很好地与使用标准进行非活动化的对象使用。如果需要对数据进行反序列化,可能需要与 Spring 结合使用。ObjectInputStream
ConfigurableObjectInputStream
Thread.currentThread().getContextClassLoader()
不幸的是,几个第三方库在不考虑上下文类加载器的情况下反序列化。如果您发现此类问题,则需要请求原始作者的修复。
20.3 实时加载
该模块包括一个嵌入式 LiveReload 服务器,可用于在资源更改时触发浏览器刷新。LiveReload 浏览器扩展版可免费提供给 Chrome、Firefox 和 Safari livereload.com。
您一次只能运行一个 LiveReload 服务器。在启动应用程序之前,请确保没有其他 LiveReload 服务器正在运行。如果从 IDE 启动多个应用程序,则只有第一个应用程序具有 LiveReload 支持。
20.4 全局设置
您可以通过向文件夹添加名为 “.” 来配置全局 devtools 设置(请注意,文件名以"."开头)。添加到此文件的任何属性都适用于计算机上使用 devtootoo 的所有 Spring Boot 应用程序。例如,要将重新启动配置为始终使用触发器文件,请添加以下属性:.spring-boot-devtools.properties
$HOME
~/.spring-boot-devtools.properties.
spring.devtools.reload.trigger-file=.reloadtrigger
开发工具属性/yaml 文件中不支持配置文件。
激活的任何配置文件都不会影响配置文件特定配置文件的加载。不支持 YAML 文件中的配置文件特定文件名(窗体)和子文档。
.spring-boot-devtools.properties
spring-boot-devtools-<profile>.properties
spring.profile
20.5 远程应用程序
Spring Boot开发人员工具不限于本地开发。远程运行应用程序时,还可以使用多个功能。远程支持是选择加入,因为启用它可能是安全风险。只有在受信任的网络上运行或使用 SSL 进行保护时,才应启用它。如果两个选项都不可用,则不应使用 DevTools 的远程支持。绝不应启用对生产部署的支持。
若要启用它,您需要确保该存档包含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
属性。与任何重要的密码或机密一样,该值应是唯一且强大的,以便无法猜测或暴力强制。
远程开发工具支持由两部分组成:接受连接的服务器端终结点和在 IDE 中运行的客户端应用程序。设置spring.devtools.remote.secret
属性时,将自动启用服务器组件。必须手动启动客户端组件。
20.5.1 运行远程客户端应用程序
远程客户端应用程序设计为从 IDE 内部运行。您需要使用与连接到的远程项目相同的类路径运行。应用程序所需的单个参数是它连接到的远程 URL。org.springframework.boot.devtools.RemoteSpringApplication
例如,如果您使用 Eclipse 或 STS,并且有一个名为"已部署到云铸造厂"的项目,则执行以下操作:my-app
- 从菜单中选择。
Run Configurations…
Run
- 创建新的"启动配置"。
Java Application
- 浏览项目。
my-app
- 用作主类。
org.springframework.boot.devtools.RemoteSpringApplication
- 添加到 (或任何远程 URL)。
https://myapp.cfapps.io
Program arguments
正在运行的远程客户端可能类似于以下列表:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 2.1.17.BUILD-SNAPSHOT
2015-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)
因为远程客户端使用的类路径与实际应用程序相同,因此可以直接读取应用程序属性。这是读取属性
spring.devtools.remote.secret
并传递到服务器进行身份验证的一种方法。
始终建议将流量用作连接协议,以便对流量进行加密,并且无法截获密码。
https://
如果需要使用代理来访问远程应用程序,请配置 和 属性。
spring.devtools.remote.proxy.host``spring.devtools.remote.proxy.port
20.5.2 远程更新
远程客户端监视应用程序类路径的更改方式与本地重新启动相同。任何更新的资源都会推送到远程应用程序,并且 (如果需要) 会触发重新启动。如果您迭代使用本地没有的云服务的功能,这非常有用。通常,远程更新和重新启动比完全重建和部署周期快得多。
![]() |
---|
只有在远程客户端运行时,才监视文件。如果在启动远程客户端之前更改文件,则不会将该文件推送到远程服务器。 |
20.5.3 配置文件系统监视程序
FileSystemWatcher的工作原理是,以一定的时间间隔轮询类更改,然后等待预定义的安静时间段,以确保不再有更改。然后将更改上载到远程应用程序。在较慢的发展环境中,安静周期可能不够,类中的更改可能会拆分为批。上载第一批类更改后,服务器将重新启动。由于服务器正在重新启动,因此无法将下一批批发送到应用程序。
这通常表现为日志中有关无法上载某些类的警告,以及随后的重试。但它也可能导致应用程序代码不一致,并在上载第一批更改后无法重新启动。RemoteSpringApplication
如果您经常发现此类问题,请尝试将spring.devtools.restart.poll-interval
和spring.devtools.restart.quiet-period
参数增加到适合您的开发环境的值:
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
现在每 2 秒轮询一次受监视的类路径文件夹以进行更改,并维护 1 秒的安静周期,以确保没有其他类更改。
20.5.4 远程开发工具的安全配置
如果在类路径上具有 Spring Security,则可能在 RemoteSpringApplication
以下日志中观察到 HTTP 错误 401 或 403:
Exception in thread "File Watcher" java.lang.IllegalStateException: Unexpected 401 UNAUTHORIZED response uploading class files
类上载的 URL 应免除 Web 安全和 csrf 筛选器。下面的示例演示如何配置对远程开发工具终结点的匿名访问:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatchers("/.~~spring-boot!~/restart").anyRequest().anonymous()
.and().csrf().disable();
}
}
![]() |
---|
上述配置将仅影响远程开发工具终结点。Spring Boot 的默认安全自动配置仍将应用于应用程序的其余部 |
分。如果应用程序的其余部分需要自定义安全性,则需要单独配置它。 |
转载请声明