20. Developer Tools

version: Spring Boot 2.1.3.RELEASE

1、使用方式

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")
}

2、属性默认值

  Spring Boot支持的几个库使用缓存来提高性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。此外,spring MVC可以在提供静态资源时向响应添加HTTP缓存头。

  虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,使您无法看到刚才在应用程序中所做的更改。因此,spring-bootdevtools默认情况下禁用缓存选项。

tip
如果不希望应用属性默认值,可以将application.properties中的spring.devtools.addproperties设置为false。
有关devtools应用的属性的完整列表,请参见DevToolsPropertyDefaultsPostProcessor.

3、自动重启

触发重启
由于DevTools监视类路径资源,触发重启的惟一方法是更新类路径。更新类路径的方式取决于使用的IDE。在Eclipse中,保存一个修改后的文件将导致更新类路径并触发重启。在IntelliJ IDEA中,构建项目(Build ->Build Project)具有相同的效果。

注意
当决定类路径上的一个条目更改时是否应该触发重启时,DevTools会自动忽略名为spring-boot、spring-boot- DevTools、springboot-autoconfigure、spring-boot-actuator和spring-boot-starter的项目。

注意:
当运行完全打包的应用程序时,Developer tools将自动禁用。如果您的应用程序是从java -jar启动的,或者是从一个特殊的类加载器启动的,那么它就被认为是一个“生产应用程序”。
Maven中将依赖项标记为可选的,
Gradle中使用定制的“只开发”配置(如上所示),这是一种最佳实践,可以防止devtools过渡地应用于使用您的项目的其他模块。

tip
DevTools依赖于应用程序上下文的shutdown钩子在重启期间关闭它。如果禁用了关机钩子,则无法正常工作
(SpringApplication.setRegisterShutdownHook(false))。

注意
当与LiveReload一起使用时,自动重启非常有效。请参阅LiveReload部分
细节。如果使用JRebel,则禁用自动重新启动,以便动态类重新加载。
其他devtools特性(如LiveReload和属性覆盖)仍然可以使用。

Note
DevTools needs to customize the ResourceLoader used by the ApplicationContext. If your
application provides one already, it is going to be wrapped. Direct override of the getResource
method on the ApplicationContext is not supported.
没看懂

重启和重新加载
 
Spring Boot提供的重启技术使用两个类加载器。不更改的类(例如,来自第三方jar的类)被加载到基类加载器中。您正在积极开发的类将加载到restart类加载器中。当应用程序重新启动时,将丢弃restart类加载器并创建一个新的类加载器。这种方法意味着应用程序重启通常比“冷启动”快得多,因为基本类加载器已经可用并已填充。

记录条件评估中的变化

  默认情况下,每次应用程序重新启动时,都会记录一个显示条件评估增量的报告。
当您进行更改时,例如添加或删除bean和设置配置属性,该报告将显示对应用程序自动配置的更改。
 若要禁用报表的日志记录,请设置以下属性

spring.devtools.restart.log-condition-evaluation-delta=false

排除 Resources

某些资源在被更改时不一定需要重新启动。例如,
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

监视其他的路径

  当您更改不在类路径上的文件时,您可能希望重新启动或重新加载应用程序。为此,可以使用spring.devtools.restart.additionalpaths属性配置其他路径,以监视更改。您可以使用前面描述的spring.devtools.restart.exclude属性来控制附加路径下的更改是触发完全重启还是实时重新加载

禁用重启

  如果不希望使用restart特性,可以使用spring.devtools.restart.enabled属性禁用它。在大多数情况下,可以在应用程序中设置此属性。属性(这样做仍然初始化restart类加载器,但它不监视文件更改)。

  如果您需要完全禁用restart支持(例如,因为它不能与特定的库一起工作),您需要在调用SpringApplication.run(…)之前将spring.devtools.restart.enabled System属性设置为false,如下面的示例所示:

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属性设置为您的触发器文件的路径。

Tip
您可能希望将spring.devtools.restart.trigger-file设置为全局设置,因此所有项目的行为都是相同的。

自定义重新启动类加载器

  正如前面在Restart vs Reload小节中描述的,重启功能是通过使用两个类加载器实现的。对于大多数应用程序,这种方法工作得很好。然而,它有时会导致类加载问题。

  默认情况下,IDE中任何打开的项目都是用“restart”类加载器加载的,而任何常规.jar文件都是用“base”类加载器加载的。如果您处理一个多模块项目,并且不是每个模块都导入到IDE中,那么您可能需要自定义一些东西。为此,您可以创建一个META-INF/spring-devtools.properties文件。
  spring-devtools.properties文件可以包含前缀为start.excluderestart.includeinclude元素是应该拉入“restart”类加载器的,而exclude元素是应该拉入“base”的类加载器。属性的值是应用于类路径的regex模式,如下所示
下面的例子:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

Note
所有属性键必须是唯一的。只要属性以start.include开始。或restart.exclude。它被认为是。

Tip
META-INF/spring-devtools.properties加载类路径中。您可以在项目内部或项目使用的库中放入此文件。

已知的限制

  对于使用标准ObjectInputStream反序列化的对象,Restart功能不能很好地工作。如果需要反序列化数据,可能需要结合Thread.currentThread().getContextClassLoader()使用Spring的ConfigurableObjectInputStream

  不幸的是,一些第三方库反序列化时没有考虑上下文类加载器。如果您发现这样的问题,您需要向原始作者请求修复

4、重新加载

  spring-boot-devtools模块包含一个嵌入式LiveReload服务器,当资源发生更改时,可以使用该服务器触发浏览器刷新。LiveReload浏览器扩展可以从livereload.com免费使用Chrome、Firefox和Safari。

  如果您不想在应用程序运行时启动LiveReload服务器,可以将spring.devtools.livereload.enabled属性设置为false。

Note
一次只能运行一个LiveReload服务器。在启动应用程序之前,请确保没有运行其他LiveReload服务器。如果您从IDE启动多个应用程序,那么只有第一个应用程序支持LiveReload

5、全局设置

  您可以通过添加一个名为.spring-bootdevtools.properties的文件来配置全局devtools设置到$HOME文件夹(注意文件名以“.”开头)。添加到此文件的任何属性都适用于您机器上使用devtools的所有Spring引导应用程序。例如,要将restart配置为始终使用触发器文件,您需要添加以下文件和属性:
~/.spring-boot-devtools.properties

spring.devtools.reload.trigger-file=.reloadtrigger

6、远程应用程序

   Spring Boot开发人员工具并不局限于本地开发。在远程运行应用程序时,还可以使用几个特性。远程支持是opt-in。要启用它,您需要确保重新打包的归档文件中包含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

Warning
在远程应用程序上启用spring-boot-devtools存在安全风险。永远不要在生产部署上启用支持

   远程devtools支持由两部分提供:接受连接的服务器端端点和在IDE中运行的客户机应用程序。当设置spring.devtools.remote.secret属性时,服务器组件将自动启用。客户端组件必须手动启动。

运行远程客户机应用程序

  远程客户机应用程序设计为在IDE中运行。您需要运行org.springframework.boot.devtools.RemoteSpringApplication,其类路径与您连接到的远程项目相同。应用程序唯一需要的参数是它连接到的远程URL。
  例如,如果您正在使用Eclipse或STS,并且您有一个名为my-app的项目,并且您已经将其部署到Cloud Foundry,那么您将执行以下操作:

  • 从“Run”菜单中选择“Run Configurations”。
  • 创建一个新的Java应用程序“launch configuration”。
  • 浏览my-app项目。
  • 使用org.springframework.boot.devtools.RemoteSpringApplication作为主类
  • 添加https://myapp.cfapps.io到程序参数(或任何远程URL)。
    正在运行的远程客户端可能类似于以下清单:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 2.1.3.RELEASE
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/springboot-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)

Note
因为远程客户机使用与实际应用程序相同的类路径,所以它可以直接读取应用程序属性。这是读取spring.devtools.remote.secret属性并将其传递给服务器进行身份验证的方法。

Tip
始终建议使用https://作为连接协议,以便对流量进行加密密码不能被截获。
如果需要使用代理访问远程应用程序,请配置
spring.devtools.remote.proxy.hostspring.devtools.remote.proxy.port
属性

Remote Update

  远程客户机以与本地重启相同的方式监视应用程序类路径的更改。任何更新的资源都会被推送到远程应用程序,并(如果需要的话)触发重启。这可以如果您对使用本地没有的云服务的特性进行迭代,这将非常有用。一般来说,远程更新和重新启动比完整的重新构建和部署周期要快得多。

Note
只有在远程客户机运行时才监视文件。如果在启动远程客户机之前更改文件,则不会将其推送到远程服务器。

demo 项目地址
https://github.com/fushun1990/spring-boot-demo.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值