springboot提供了devtools开发工具进行热部署,修改类源文件并保存,重新编译后(Java IDE需勾上自动编译),springboot会自动重启,重新加载字节码文件。提供spring-boot-devtools模块,改进开发体验。
添加依赖
- <!– 热部署 –>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <optional>true</optional>
- </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线程如此的耀眼
虽说方便点,改手动重启还是手动重启。。。
参考
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
发表评论