spring boot学习系列之devtools热部署初识8

springboot提供了devtools开发工具进行热部署,修改类源文件并保存,重新编译后(Java IDE需勾上自动编译),springboot会自动重启,重新加载字节码文件。提供spring-boot-devtools模块,改进开发体验。

添加依赖

  1. <!– 热部署 –>
  2. <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-devtools</artifactId>
  5.     <optional>true</optional>
  6. </dependency>

将依赖optional可选标记设置为true,防止传递devtools依赖到其他模块。

默认属性

你有可能在项目中使用到模板技术。如Thymeleaf,可以通过设置spring.thymeleaf.cache属性值来标记页面是否启用缓存。设置为false,允许你在不重启应用情况下更新页面。通常开发环境上禁用缓存,用于调试,生产环境启用缓存,提高性能。现在使用spring-boot-devtools模块,就不需要考虑这些。Thymeleaf, Freemarker, Groovy Templates, Velocity and Mustache 等模板缓存都会自动禁用。

自动重启

在过去可能会使用JRebel或者Spring Loaded来重启应用。他们固然甚好,但他们经常要额外配置或者IDE插件才能工作。当你使用spring-boot-devtools模块,任何类路径文件改变会自动触发应用重启。springboot提供的重新启动技术使用了两个类加载器。 不改变的类(例如,来自第三方jar的)被加载到 base 类加载器中。 你正在开发的类被加载到restart类加载器中。当应用程序重启时, restart加载器将被丢弃,并创建一个新的类加载器。 这种方法意味着应用程序重启通常比“冷启动”快得多,因为 base 加载器已经已加载并且可用。

可以通过spring.devtools.restart.enabled属性来禁用重启,或在springboot应用启动SpringApplication.run之前设置java环境属性System.setProperty("spring.devtools.restart.enabled", "false");来完全禁用重启。

可以通过spring.devtools.restart.exclude属性排除要重启的资源。如:

spring.devtools.restart.exclude=static/**,public/**

实时重载

开发阶段,代码修改或应用重启,经常要手动刷新浏览器来调试。当你使用spring-boot-devtools模块,它会嵌入实时重载服务,允许应用有修改时自动触发浏览器刷新。支持Chrome, Firefox and Safari 等浏览器扩展。

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

同一时间只能运行一个LiveReload服务器。 开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。

远程调试通道

当你使用Docker容器或者微PaaS框架Lattice【https://github.com/cloudfoundry-attic/cf-release】你会感到调试代码困难,你需要配置java 启动参数-Xdebug或者转发一个合适的端口来获取远程调试器。使用devtools模块,应用在Http之上建立JDWP (the Java Debug Wire Protocol) 通道,这甚至可以在部署到互联网云服务提供商,仅暴露80和443端口的应用上工作,虽然有可能慢。

远程更新重启

devtools模块会监控本地类路径文件改变并推送给远程服务器,然后重启。与本地重启一样,可以结合实时重载服务。

已知限制

重启功能对使用标准ObjectInputStream对象序列化的对象不是很好 。如果需要反序列化数据,可能需要使用Spring的ConfigurableObjectInputStream配合Thread.currentThread().getContextClassLoader() 使用。

测试

将控制层的一个类方法增加一个入参,并输出打印,保存。再访问这个链接,发现可以输出。

保存编译后,devtools监听到类文件改变,自动重启了。有个restartedMain线程如此的耀眼

restartmain

虽说方便点,改手动重启还是手动重启。。。

参考

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-devtools

https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3

发表评论

电子邮件地址不会被公开。 必填项已用*标注

24 + 9 = ?