让我们提高开发效率,尝试使用Spring Boot 1.3里的开发工具吧
首先
在Spring Boot 1.3版本中,引入了一个名为spring-boot-devtools的开发辅助模块。
我写了一个粗略的翻译和个人感想,关于该模块的概述(Spring Boot 1.3中的DevTools)。
(在部分内容中,我根据参考指南的描述进行了一些补充说明)
Spring Boot 1.3 中的 DevTools
在Spring Boot 1.3中,将能够使用一个方便的开发工具模块叫做spring-boot-devtools!要使用它,需要添加依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
有点简短的前言
以下的描述中提到了“在开发阶段将会自动执行○○”,但是“开发阶段 ≠ 生产环境”的判断将会根据应用程序的启动方式自动判断。
具体来说,如果是通过java -jar启动或者使用了其他特殊的类加载器,将会被视为“生产环境”。
物业默认值
在使用Spring Boot 1.2版本的时候,你可能知道可以通过spring.thymeleaf.cache的配置将模板的缓存关闭。
这种配置虽然方便,但是在开发中,总是要时刻关注缓存的开启或关闭真的很烦人。
因此,在开发阶段,我们已经将模板引擎(Thymeleaf、Freemarker、Groovy Templates、Velocity、还有Mustache)的缓存默认关闭了。
自动重启
我认为使用JRebel或Spring Loaded的人应该知道,自动重新加载功能很方便。
但是如果想要使用这些工具,就必须调整IDE的设置,而且有些工具可能还需要付费!
这些“即时重新加载”技术稍微慢一些,但我使它们能够做类似的事情。
如果包含spring-boot-devtools,那么它会捕捉类路径上的所有文件,如果文件有更改,它将自动重新启动应用程序。
填补
默认情况下,即使Thymeleaf模板、css、js等不需要重新编译的静态文件发生更改,自动重启也不会执行(因为根本不需要重新启动)。但是,它可以作为接下来要讨论的LiveReload的触发器。为了将其排除在自动重启的触发器范围之外,可以使用以下属性。
spring.devtools.restart.exclude
デフォルトの例外対象を無視して、完全に例外を指定しなおす場合に利用
e.g. spring.devtools.restart.exclude=static/**,public/**
spring.devtools.restart.additional-exclude
デフォルトの例外対象(/resourceや/staticなど)はそのままに、例外対象を追加する場合に利用
如果您想将classpath之外的文件设为自动重启的目标,您可以在spring.devtools.restart.additional-paths属性中进行指定。
实时重新加载
为了将”cache properties”和”automatic restarts”的操作反映在屏幕上,需要在浏览器中点击刷新按钮,很麻烦对吧。
如果使用LiveReload功能,它会自动通知浏览器进行刷新,这样应用程序重新启动后浏览器会自动更新!
为此,可以免费从livereload.com安装浏览器扩展。
(Chrome、Firefox、Safari都支持)
填补
LiveReload的功能只对一个应用程序有效。例如,如果同时启动了多个应用程序,则只有最先启动的一个应用程序才会被LiveReload支持。
远程调试隧道
我猜你可能有使用过Docker或Lattice,但调试真的很麻烦吧。
为了进行远程调试,还需要加上-Xdebug选项,并将它正确地转发到适当的端口……这些配置也是必须要做的。
在Spring Boot 1.3中,通过使用Java调试线协议(JDWP),即使服务器上只有80和443端口可用,也可以通过简单的配置进行远程调试。
远程更新和重新启动
不仅可以远程调试,还可以远程更新和重新启动正在运行的应用程序!换句话说,当在本地更改文件时,这些更改会反映在远程服务器的应用程序中。
補充
这个功能默认是被禁用的。
为了使用它,需要设置spring.devtools.remote.secret。
假设我正在将名为my-app的服务部署到Cloud Foundry平台上的https://myapp.cfapps.io,其配置步骤如下。
-
- 将spring.devtools.remote.secret的值设置在my-app的application.properties文件中进行部署。
(该值仅用于Local和Remote的匹配,因此可以是任何值。)
在IDE的Run Configuration中,将main class指定为org.springframework.boot.devtools.RemoteSpringApplication。
在Program arguments中指定https://myapp.cfapps.io。
如果使用这个设置来启动,将会得到如下的控制台输出。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 1.3.0.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 Boot 1.3中的DevTools(演示)。
所感 (suǒ
遠隔更新和重啟功能非常強大。
這使得可以在遠程操作的情況下,更新系統並重新啟動。
写代码→编译→部署(将文件放置并启动)→在浏览器中更新
这项工作
编写代码 → 自动在浏览器中实时显示
只要专注于编码,就好像只需要编码一样,似乎可以带到这种状态。
文献引用
开始使用Spring Boot 1.3与DevTools
Spring Boot 1.3 新闻 #渋谷Java