Spring boot Devtools教程

时间:2020-02-23 14:35:46  来源:igfitidea点击:

在本教程中,我们将查找Spring为开发人员体验提供的内容。

概述

使用像Eclipse这样的IDES,Spring Tool Suite,Intellij Idea典型的开发设置包括一个应用程序代码库,它在Web应用程序服务器上部署 Wildfly或者 Tomcat甚至 Glassfish
发展速度是基于 Edit, Compile, Run Cycle每个循环都需要重新启动服务器,以便应用程序加载新的更改。
这导致浪费了很多时间等待应用程序服务器启动。

jrebel.

JRebel允许开发人员在Java开发期间跳过重建并重新部署,并维护应用程序状态。

这允许开发人员了解代码更改如何实时影响其应用程序,并通过避免重建和重新部署来节省大量时间。
它基于热插拔的概念,但这一切都以成本为基础,具体取决于用例,JRebel可能会变成昂贵的选择。

Spring boot Devtools介绍

Spring Boot包括一组另外的工具,可以使应用程序开发体验更令人愉快。

spring-boot-devtools模块可以包含在任何项目中以提供另外的开发时间

向项目添加DevTools

获取文件>新项目并添加必要的依赖项,可以转到Spring Starter IO。

并添加以下依赖项:

  • Springboot子脱池

之后你的 pom.xml看起来像:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath <!-- lookup parent from repository -->
    </parent>
 
    <dependencies>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
 
    </dependencies>

范围是 runtime这意味着这是动态加载的代码,并且在程序代码中不直接引用并将其保留在传递中。
optional标志设置为 true防止其过境应用于使用我们项目的其他模块。

Spring Boot DevTools功能

属性默认值

Spring-Boot进行了大量的自动配置,它基于环境基本上设置了不同的配置文件。
它允许我们根据配置文件设置属性。

记录

devtools会切换 log leveldebug在给定实例中提供更有洞察力的内容。
例如把devtools放在一个 REST api项目将为我们提供有关输入请求,处理处理程序,响应等的信息。

//要启用请求的日志记录(但这不会记录身体)spring.http.log-request-details = true

缓存

在生产中,依赖于各种缓存(如模板引擎的高速缓存,静态资源等缓存标题是至关重要的,但在开发设置中我们想要禁用缓存,以便我们始终看到我们执行的最新更改。
如果在DEV环境中启用了缓存,则对我们提供的数据可能陈旧导致清除缓存或者混淆时识别是否解决了错误。

DevTools通过将缓存缓存到False并启用将启动到开发技能的其他设置,为Dev环境配置许多这些缓存设置。

缓存选项通常由Application.properties文件中的设置配置。

  • spring.thymeleaf.cache = false - spring.freemarker.cache = false - spring.grovy.template.cache = false - springmustache.cache = false - server.servlet.session.persistent = true - spring.h2.console .enabled = true - spring.resources.cache.period = 0 - spring.resources.chain.cache = false - spring.template.provider.cache = false - sppring.mvc.log-解析 - service = true - server.servlet .jsp.init-parameters.development = true - spring.reaceCtor.stacktrace-mode.enabled = true

如果我们不希望应用默认值,可以设置 spring.devtools.add-properties=false在应用程序中.Properties。

自动重启

代码更改并部署到测试是应用程序开发的重要部分,每次修改代码时,都会重新部署更改。
每当修改类文件时,Spring Boot DevTools通过提供自动重新启动到应用程序。

现在重新启动也是一个精细的进程,服务器确实需要一些时间来启动但是这个 Automatic Restart不是传统的 stopre-run

在引擎盖下,Springdevtools使用两个 classloaders:基础:没有改变的类。
重新启动:积极工作的程序。

每当触发重新启动时,现有 restart classloader被丢弃并重新创建,比平常快得多。
这是什么 devtools与jrebel这样的工具不同 dynamic class reloading
在此事件中,使用更改应用程序自动配置来编写日志。
以下是我们可以执行的一些常见配置列表。

//禁用日志Spring.DevTools.restart.log-条件 - equation-delta = false

//另外设置要从触发自动重新启动spring.devtools.restart.exclude =静态/**,公共/**的资源

//要保留默认值并添加标记排除规则使用以下而不是上面的spring.devtools.restart.additional-rellude = //添加类路径以触发自动重启spring.devtools.restart.additional-path =

//要完成此功能Spring.devtools.restart.enabled = false

//在更改时设置文件(且仅在)应触发重启spring.devtools.restart.trigger-file =

//将项目子模块添加到自动重启restart.include.projectCommon =/<your_jar_name> - [\ w \ d - \。
] + \。
jar

使用标准重新启动功能不适用于De-Serialized的对象 ObjectInputStream
如果需要反序列化数据,我们可能需要使用Spring的 ConfigurableObjectInputStream结合 Thread.currentThread().getContextClassLoader()

生活重装

此功能大多数与webapp相关(也许是一个 jsp)我们可以其中进行更改 HTMLCSS并看到它们几乎立即改变。
在尝试通过预处理文件获取最后一个按钮像素时非常有用(编译 SASS或者 LESS文件)根据需要。
另一个用例是监视和重新加载API的输出。
只有一个实例可以一次运行,而在多个应用程序运行此功能时,只有第一个应用程序会运行。

//To disable it
spring.devtools.livereload.enabled=false

我们可以为浏览器安装浏览器插件以支持它。
我使用Chrome,这个插件派上用场。

我们也可以为浏览器查找类似的插件。

全局设置

如果我们必须根据开发环境复制粘贴一堆设置,则将是什么好的devtools。
DevTools提供了一种漂亮的方法来定义使用DevTools将使用的每个应用程序的全局设置。

只需创建一个文件夹 $HOME/.config/spring-boot并添加A. spring-boot-devtools.properties文件包含所有偏好。
支持的其他配置扩展名 yamlyml如果我们从此全局文件激活Spring 概要文件,则无关紧要。

项目中的配置文件将始终挑选特定于个人资料的配置文件

远程应用程序

这更像是一个 UATPre-Prod功能,但我非常强大建议我们在生产系统中保持此功能,即使它可能有用,它会导致生产设置的严重安全威胁。
因此,默认情况下它已禁用。
要在"构建插件"中启用它添加以下配置

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludeDevtools>false</excludeDevtools>
                </configuration>
            </plugin>
        </plugins>
    </build>

现在只需在密码中设置密码 application.properties为客户互动

spring.devtools.remote.secret=

建议将使用此功能时永远使用 https
无法强调此功能在生产设置中的风险程度。

远程客户端应用程序旨在从IDE中运行。
你需要运行步 org.springframework.boot.devtools.RemoteSpringApplication使用与我们连接的远程项目相同的类路径。
应用程序的单个必需的参数是它连接的远程URL。
远程客户端监视应用程序CLASSPATH以与本地重新启动的方式相同的方式更改。
任何更新的资源都会被推到远程应用程序,(如果需要)触发重新启动。
如果我们迭代使用我们没有本地云服务的功能,则会有用。

文件系统观察者

它通过轮询程序随着一定时间间隔进行调查,然后等待预定义的安静时期,以确保没有更多的变化。
然后将更改上载到远程应用程序。
如果延迟太高,更改需要更长时间才能上传。
我们可以在以下属性下设置以进行调整

spring.devtools.restart.poll-interval=2s 
spring.devtools.restart.quiet-period=1s