SpringBoot官⽅⽂档中⽂版-8.开发者⼯具
前⾔
这是 SpringBoot 官⽅⽂档中⽂翻译版系列的第⼋篇⽂章:
前七篇⽂章如下:
开发者⼯具
Spring Boot 包括⼀组额外的⼯具,可以使应⽤程序开发体验更愉快⼀些。任何项⽬都可以包含 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
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
java定义string数组并赋值当运⾏完全打包的应⽤程序时,Developer tools 将被⾃动禁⽤。如果您的应⽤程序是从 java -jar 启动的,或者是从⼀个特殊的类装⼊器启动的,那么它就被认为是“⽣产应⽤程序”。你可以使⽤ abled 系统属性来控制这种⾏为。
要启⽤ devtools,不管⽤于启动应⽤程序的类加载器是什么,设置-abled=t
rue系统属性。在⽣产环境中不能这样做,因为运⾏devtools 会带来安全风险。要禁⽤ devtools,请排除依赖项或设置 -abled=false 系统属性。
在 Maven 中将依赖标记为可选的,或者在 Gradle 中使⽤ developmentOnly 配置(如上所⽰),可以防⽌ devtools 被传递应⽤到使⽤你的项⽬的其他模块。
重新打包的归档⽂件默认不包含 devtools。如果您想使⽤某个远程 devtools 特性,则需要包含它。当使⽤ Maven 插件时,将 excludeDevtools 属性设置为false。当使⽤ Gradle 插件时,配置任务的类路径以包含 developmentOnly 配置。
1. 默认属性
Spring Boot ⽀持的⼀些库使⽤缓存来提⾼性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板⽂件。此外,Spring MVC 可以在提供静态资源时为响应添加 HTTP 缓存头。
虽然缓存在⽣产中⾮常有⽤,但在开发期间可能会产⽣相反的效果,使您⽆法看到刚刚在应⽤程序中所做的更改。因此,spring-boot-devtools 默认禁⽤缓存选项。
缓存选项通常由应⽤程序中的设置来配置。属性⽂件。例如,Thymeleaf 提供了 spring.thymeleaf.cache 属性。spring-boot-devtools 模块不需要⼿动设置这些属性,⽽是⾃动应⽤合
理的开发时间配置。
因为在开发 Spring MVC 和 Spring WebFlux 应⽤程序时,您需要更多关于 web 请求的信息,所以开发⼈员⼯具将为 web ⽇志组启⽤ DEBUG ⽇志。这将为您提供有关传⼊请求的信息、哪个处理程序正在处理它、响应结果等等。如果希望记录所有请求细节(包括潜在的敏感信息),可以打开 spring.mvc.log-request-details 或 dec.log-request-details 配置属性。
如果你不希望应⽤默认属性,你可以在 application.properties 中将 spring.devtools.add-properties 设置为 false。
2. ⾃动重启
只要类路径上的⽂件发⽣更改,使⽤ spring-boot-devtools 的应⽤程序就会⾃动重新启动。在 IDE 中⼯作时,这是⼀个⾮常有⽤的特性,因为它为代码更改提供了⼀个⾮常快速的反馈循环。默认情况下,将监视指向⽬录的类路径上的任何条⽬的更改。注意,某些资源,如静态资产和视图模板,不需要重新启动应⽤程序。
由于 DevTools 监控类路径资源,触发重启的唯⼀⽅法是更新类路径。更新类路径的⽅法取决于你使⽤的IDE:
在 Eclipse 中,保存修改后的⽂件会导致更新类路径并触发重新启动。
在 IntelliJ IDEA 中,构建项⽬(Build +→+ Build project)也有同样的效果。
如果使⽤构建插件,运⾏ mvn compile for Maven 或 gradle build for gradle 将触发重新启动。
如果你使⽤构建插件重新启动 Maven 或 Gradle,你必须让 forking 设置为 enabled。如果禁⽤ forking,则⽆法创建devtools使⽤的孤⽴应⽤程序类加载器,重启也⽆法正常运⾏。
当与 LiveReload ⼀起使⽤时,⾃动重启⼯作得⾮常好。有关详细信息,请参阅。如果使⽤ JRebel,将禁⽤⾃动重新启动,以⽀持动态类重新加载。其他的 devtools 特性(⽐如LiveReload和属性覆盖)仍然可以使⽤。
在重启期间,DevTools 依赖于应⽤上下⽂的 shutdown钩⼦。如果你禁⽤了 shutdown钩⼦(SpringApplication.setRegisterShutdownHook(false)),DevTools 就不能正常⼯作。
重启和重载
Spring Boot 提供的重启技术通过使⽤两个类加载器来⼯作。不更改的类(例如,来⾃第三⽅jar的类)被加载到基类加载器中。您正在积极开发的类被加载到重新启动的类加载器中。当应⽤程序重新启动时,
重新启动类加载器将被丢弃,并创建⼀个新的类加载器。这种⽅法意味着应⽤程序重新启动通常⽐“冷启动”快得多,因为基类加载器已经可⽤并填充了。
如果您发现重新启动应⽤程序不够快,或者遇到类加载问题,您可以考虑重新加载 ZeroTurnaround 的 JRebel 等技术。它们的⼯作原理是在装⼊类时重写类,使它们更易于重新装⼊。
2.1 条件评估中的⽇志变化
默认情况下,每次应⽤程序重新启动时,都会记录⼀个显⽰条件评估增量的报告。当您进⾏更改(如添加或删除bean和设置配置属性)时,该报告将显⽰对应⽤程序⾃动配置的更改。
若要禁⽤报表的⽇志记录,请设置以下属性:
start.log-condition-evaluation-delta=false
2.2 不包括的资源
某些资源在被更改时不⼀定需要触发重新启动。例如,可以就地编辑 Thymeleaf 模板。默认情况下,改变 /META-INF/maven、/META-INF/resources、/resources、/static、
/
os系统哪个好用public 或 /templates 中的资源不会触发重新启动,但会触发实时重新加载。如果您想定制这些排除,可以使⽤lude 属性。例如,要只排除 /static 和
/public,你可以设置以下属性:
lude=static/**,public/**
如果您想保留这些默认值并添加额外的排除项,请使⽤ start.additional-exclude 属性。
2.3 配置额外的路径
当对不在类路径上的⽂件进⾏更改时,您可能希望重新启动应⽤程序或重新加载应⽤程序。为此,请使⽤ start.additional-paths 属性来配置额外的路径,以监视更改。您可以使⽤前⾯描述的 lude 属性来控制附加路径下的更改是触发完全重新启动还是实时重新加载。
2.4 禁⽤重启
如果您不想使⽤重启特性,可以使⽤ abled 属性禁⽤它。在⼤多数情况下,
您可以在应⽤程序中设置此属性。属性(这样做仍然初始化重新启动类加载器,但它不会监视⽂件更改)。
如果你需要完全禁⽤重启⽀持(例如,因为它不与特定的库⼀起⼯作),你需要在调⽤ SpringApplication.run(…) 之前将 abled System 属性设置为 false,如下⾯的⽰例所⽰:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("abled", "false");
SpringApplication.run(MyApplication.class, args);
}
}
2.5 使⽤触发器⽂件
长沙小程序开发制作如果您使⽤的IDE持续编译更改的⽂件,您可能更喜欢只在特定时间触发重新启动。为此,您可以使⽤“触发⽂件”,这是⼀个特殊的⽂件,当您希望实际触发重新启动检查时,必须修改该⽂件。
要使⽤触发器⽂件,请将 igger-file 属性设置为您的触发器⽂件的名称(不包括任何路径)。触发器⽂件必须出现在类路径的某个位置。
例如,如果你有⼀个具有以下结构的项⽬:
src
+- main
+- resources
+- .reloadtrigger
那么你的 trigger-file 属性是:
igger-file=.reloadtrigger
重启将只发⽣在 src/main/resources/.reloadtrigger 更新时。
有些 ide 的特性可以使您不必⼿动更新触发器⽂件。针对 Eclipse 的 Spring Tools 和都有这样的⽀持。使⽤ Spring Tools,您可以在控制台视图中使⽤ “reload” 按钮(只要您的触发器⽂件名为.reloadtrigger)。对于 IntelliJ IDEA,您可以按照其。
2.6 定制重启类加载器
如前⾯的 Restart vs Reload ⼀节所述,重启功能是通过使⽤两个类加载器实现的。对于⼤多数应⽤程序来说,这种⽅法⼯作得很好。然⽽,它有时会导致类加载问题。
默认情况下,IDE 中任何打开的项⽬都是⽤ “restart” 类加载器加载的,任何常规的 .jar ⽂件都是⽤ “base” 类加载器加载的。如果您在⼀个多模块项⽬中⼯作,并且不是每个模块都被导⼊到 IDE 中,那么您可能需要⾃定义内容。为此,您可以创建 META-INF/spring-devtools。属性⽂件。
spring-devtools.properties ⽂件可以包含以重启为前缀的属性 lude 和 restart.include。inclu
de 元素是应该上拉到 “restart” 类加载器中的项,⽽ exclude 元素是应该下推到 “base” 类加载器中的项。该属性的值是应⽤于类路径的正则表达式模式,如下⾯的⽰例所⽰:
restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\\.]+\\.jar
所有属性键必须是唯⼀的。只要属性以 restart.include 启动。或 lude。它被认为是正确的。
2.7 已知的限制
对于使⽤标准 ObjectInputStream 反序列化的对象,重新启动功能不能很好地⼯作。如果需要反序列化数据,可能需要结合使⽤ Spring 的ConfigurableObjectInputStream 和Thread.currentThread(). getcontextclassloader()。
不幸的是,⼀些第三⽅库在不考虑上下⽂类装⼊器的情况下进⾏了反序列化。如果您发现了这样的问题,您需要向原始作者请求修复。
3. LiveReload
spring-boot-devtools 模块包含⼀个嵌⼊式的 LiveReload 服务器,可⽤于在资源更改时触发浏览器刷新。LiveReload 浏览器扩展免费提供 Chrome, Firefox和 Safari 从livereload。
如果您不想在应⽤程序运⾏时启动 LiveReloa d服务器,可以将 spring.abled 属性设置为 false。
⼀次只能运⾏⼀个 LiveReload 服务器。在启动应⽤程序之前,确保没有其他 LiveReload 服务器在运⾏。如果从 IDE 启动多个应⽤程序,则只有第⼀个应⽤程序⽀持LiveReload。
要在⽂件更改时触发 LiveReload,必须启⽤⾃动重启。
4. 全局设置
您可以通过将下列⽂件添加到 $HOME/.config/spring-boot ⽬录,来配置全局的 devtools 设置。
spring-boot-devtools.properties
spring-boot-devtools.yaml
添加到这些⽂件中的任何属性都适⽤于您机器上使⽤ devtools 的所有 Spring Boot 应⽤程序。例如,要将重启配置为总是使⽤触发器⽂件,你需要在 spring-boot-devtools ⽂件中添加以下属性:
igger-file=.reloadtrigger
4.1 配置⽂件系统监控
FileSystemWatcher 的⼯作⽅式是,按⼀定的时间间隔轮询类更改,然后等待预定义的安静时间,以确保没有更多更改。由于 Spring Boot 完全依赖于 IDE 来编译和复制⽂件到Spring Boot 可以读取它们的位置,所以您可能会发现,当 devtools 重新启动应⽤程序时,某些更改可能没有反映出来。如果您经常观察到这样的问题,请尝试将
start.poll-interval 和 start.quiet-period 参数增加到适合您的开发环境的值:
start.poll-interval=2s
start.quiet-period=1s
监视的类路径⽬录现在每 2 秒轮询⼀次更改,并维持 1 秒的静默期,以确保没有额外的类更改。
5. 远程应⽤程序
Spring Boot 开发⼈员⼯具并不局限于本地开发。在远程运⾏应⽤程序时,还可以使⽤⼏个特性。远程⽀持是可选的,因为启⽤远程⽀持可能存在安全风险。只有在可信⽹络上运
⾏或使⽤ SSL 保护时才应该启⽤它。如果这两个选项对你都不可⽤,你就不应该使⽤ DevTools 的远程⽀持。永远不要在⽣产部署中启⽤⽀持。
要启⽤它,需要确保重新打包的归档⽂件中包含了devtools,如下所⽰:
<build>
<plugins>
<plugin>
properties文件用什么打开<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>如何更改php文件路径
然后您需要设置 secret 属性。与任何重要的密码或秘密⼀样,该值应该是惟⼀的且强度⾼,这样就不会被猜测或强制使⽤。
远程 devtools ⽀持分为两部分提供:接受连接的服务器端端点和在IDE中运⾏的客户端应⽤程序。
当设置 secret 属性时,服务器组件会⾃动启⽤。客户端组件必须⼿动启动。
5.1 运⾏远程客户端程序
远程客户端应⽤程序被设计为在 IDE 中运⾏。您需要使⽤与所连接的远程项⽬相同的类路径运⾏org.springframework.boot.devtools.RemoteSpringApplication。应⽤程序唯⼀必
需的参数是它连接到的远程 URL。
例如,如果你正在使⽤ Eclipse或 Spring Tools,并且你有⼀个名为 my-app 的项⽬,你已经部署到 Cloud Foundry,你会做以下事情:
从Run菜单中选择Run Configurations…
创建新的Java应⽤程序“启动配置”。
浏览my-app项⽬。
使⽤org.springframework.boot.devtools.RemoteSpringApplication作为主类。
将myapp.cfapps.io添加到Program参数中(或者您的远程URL是什么)。
⼀个正在运⾏的远程客户端可能类似于下⾯的清单:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
delete from employee语句的作用\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 2.5.3
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-project/spring-boot-devtools/tar 2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing t.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 201 2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.RemoteClientConfiguration : The connection to localhost:8080 is insecure. You should use a URL starting with ''.
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)
因为远程客户端使⽤与实际应⽤程序相同的类路径,所以可以直接读取应⽤程序属性。这就是读取 secret 属性并将其传递给服务器进⾏⾝份验证的⽅式。
建议使⽤作为连接协议,以便加密通信和密码不能被拦截。
5.2 远程更新
远程客户机以与本地重启相同的⽅式监视应⽤程序类路径的更改。任何更新的资源都被推到远程应⽤程序,并(如果需要)触发重新启动。如果您迭代使⽤本地没有的云服务的特
性,这将⾮常有⽤。通常,远程更新和重启⽐完整的重建和部署周期要快得多。
在较慢的开发环境中,可能会出现静默期不够⽤,类中的更改可能会被分批处理。在上传第⼀批类更改后,服务器将重新启动。下⼀批⽆法发送到应⽤程序,因为服务器正在重
新启动。
这通常表现为在 RemoteSpringApplication ⽇志中出现关于未能上载某些类的警告,以及随后的重试。但它也可能导致应⽤程序代码不⼀致,并且在上传第⼀批更改后⽆法重新
启动。如果您经常观察到这样的问题,请尝试将 start.poll-interval 和 start.quiet-period 参数增加到适合您的开发环境的值。有关配置这些属
性,请参阅配置⽂件系统监视器⼀节。
每天学习⼀点点,每天进步⼀点点。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论