Spring-Boot开发者工具:自动重启、LiveReload、远程开发、默认的开发时属性值

简介: Spring-Boot开发者工具:自动重启、LiveReload、远程开发、默认的开发时属性值

Spring Boot 1.3引入了一组新的开发者工具,可以让你在开发时更方便地使用Spring Boot,包括如下功能。

  • 自动重启:当Classpath里的文件发生变化时,自动重启运行中的应用程序。
  • LiveReload支持:对资源的修改自动触发浏览器刷新。
  • 远程开发:远程部署时支持自动重启和LiveReload
  • 默认的开发时属性值:为一些属性提供有意义的默认开发时属性值。

Spring Boot的开发者工具采取了库的形式,可以作为依赖加入项目。如果你使用Gradle来构建项目,可以像下面这样在build.gradle文件里添加开发工具:

compile "org.springframework.boot:spring-boot-devtools"

在Maven POM里添加<dependency>是这样的:

<dependency> 
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-devtools</artifactId> 
</dependency>

当应用程序以完整打包好的JAR或WAR文件形式运行时,开发者工具会被禁用,所以没有必要在构建生产部署包前移除这个依赖。

一、自动重启

在激活了开发者工具后,Classpath里对文件做任何修改都会触发应用程序重启。为了让重启速度够快,不会修改的类(比如第三方JAR文件里的类)都加载到了基础类加载器里,而应用程序的代码则会加载到一个单独的重启类加载器里。检测到变更时,只有重启类加载器重启。

有些Classpath里的资源变更后不需要重启应用程序。像Thymeleaf这样的视图模板可以直接编辑,不用重启应用程序。在/static或/public里的静态资源也不用重启应用程序,所以Spring Boot 开发者工具会在重启时排除掉如下目录:/META-INF/resources/resources/static/public/templates

可以设置spring.devtools.restart.exclude属性来覆盖默认的重启排除目录。例如,你只排除/static/templates目录,可以像这样设置spring.devtools.restart. exclude

spring: 
 devtools: 
 restart: 
 exclude: /static/**,/templates/**

另一方面,如果想彻底关闭自动重启,可以将spring.devtools.restart.enabled设置为false:

spring: 
 devtools: 
 restart: 
 enabled: false

另外,还可以设置一个触发文件,必须修改这个文件才能触发重启。例如,在修改为.trigger 的文件前你都不希望执行重启,那么你只需像这样设置spring.devtools.restart.trigger-file属性:

spring: 
 devtools: 
 restart: 
 trigger-file: .trigger

如果你的IDE会连续编译修改的文件,那触发文件还是很有用的。没有触发文件的话,每次变更都会触发重启。有触发文件,就能保证只有你想重启时才会发生重启(修改触发文件即可)。

二、LiveReload

在Web应用程序开发过程中,最常见的步骤大致如下:

  • 修改要呈现的内容(比如图片、样式表、模板)。
  • 点击浏览器里的刷新按钮,查看修改的结果。
  • 回到第1步。

虽然这并不难,但如果能不点刷新就直接看到修改结果,那岂不是更好?

Spring Boot的开发者工具集成了LiveReload(http://livereload.com,可以消除刷新的步骤。激活开发者工具后,Spring Boot会启动一个内嵌的LiveReload服务器,在资源文件变化时会触发浏览器刷新。你要做的就是在浏览器里安装LiveReload插件。

如果想要禁用内嵌的 LiveReload 服务器,可以将 spring.devtools.livereload. enabled设置为false:

spring: 
 devtools: 
 livereload: 
 enabled: false

三、远程开发

在远程运行应用程序时(比如部署到服务器上或云上),开发者工具的自动重启和LiveReload特性都是可选的。此外,Spring Boot开发者工具还能远程调试Spring Boot应用程序。

在传统的开发过程中,你不会打开远程开发功能,因为这会影响性能。但在一些特殊的场景中,此类工具就很有用。比如,出于开发目的,所开发的应用程序部署在非生产环境里。如果应用程序不是在本地开发环境里,而是在云端部署,则尤其如此。

你必须设置一个远程安全码来开启远程开发功能:

spring: 
 devtools: 
 remote: 
 secret: myappsecret

有了这个属性后,运行中的应用程序就会启动一个服务器组件以支持远程开发。它会监听接受变更的请求,可以重启应用程序或者触发浏览器刷新。

为了使用这个远程服务器,你需要在本地运行远程开发工具的客户端。这个远程客户端是一个类,全限定类名是org.springframework.boot.devtools.RemoteSpringApplication。它会运行在IDE里,要求提供一个参数,告知远程应用程序部署在哪里。

例如,假设你正远程运行阅读列表应用程序,部署在 Cloud Foundry 上,地址是 https://readinglist.cfapps.io。如果你正在使用Eclipse或Spring ToolSuite,可以通过如下步骤开启远程客户端。

  1. 选择Run > Run Configurations菜单项。
  2. 创建一个新的Java Application运行配置。
  3. 在Project里选中Reading List项目(可以键入项目名或者点击Browse按钮找到这个项目,见图A-1)。
  4. 在Main Class里键入org.springframework.boot.devtools.RemoteSpringAppli-cation(见图A-1)。
  5. 切换到Arguments标签页,在Program Arguments里键入https://readinglist.cfapps. io(见图A-2)。

客户端启动后,就可以在IDE里修改应用程序了。在检测到变动后,这些修改点会被推送到远端并加以应用。如果修改的内容涉及呈现的Web资源(比如样式表或JavaScript),LiveReload 还会触发浏览器刷新。

远程客户端还会开启基于HTTP的远程调试通道,这样就能在IDE里调试部署在远程的应用程序了。你要做的就是确保远程应用程序打开了远程调试功能。这通常可以通过配置JAVA_OPTS来实现。

比方说,你的应用程序部署在Cloud Foundry上,可以像下面这样在应用程序的manifest.yml里设置JAVA_OPTS。

---
 env: 
  JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"

远程应用程序启动后,会和本地调试服务器建立一个连接。你可以设置断点,一步步执行远程应用程序里的代码,就好像它们运行在本地一样(出于网络原因,速度会有点慢)。

四、默认的开发时属性

有些配置属性通常在开发时设置,从来不用在生产环境里。比如视图模板缓存,在开发时最好关掉,这样你可以立刻看到修改的结果。但在生产环境里,为了追求更好的性能,应该开启视图模版缓存。

默认情况下,Spring Boot会为其支持的各种视图模板(ThymeleafFreemarkerVelocityMustacheGroovy模板)开启缓存选项。但如果存在Spring Boot的开发者工具,这些缓存就会禁用。

实际上,这就是说在开发者工具激活后,如下属性会设置为false:

  • spring.thymeleaf.cache
  • spring.freemarker.cache
  • spring.velocity.cache
  • spring.mustache.cache
  • spring.groovy.template.cache

这样一来,就不用在开发时(在一个开发时使用的Profile配置里)禁用它们了。

五、全局配置开发者工具

你应该已经注意到了,在使用开发者工具时,你通常会在多个项目里使用相同的设置。举个例子,如果你使用了重启触发文件,那么你很可能在多个项目里都使用相同的触发文件名。相比在每个项目里重复开发者工具配置,对开发者工具做全局配置显得更方便一些。

要实现这个目的,可以在你的主目录(home directory)里创建一个名为.spring-boot-devtools. properties的文件。(请注意,文件名用“.”开头。)在那个文件里,你可以设置希望在多个项目里共享的各种开发者工具属性。

例如,假设你想把触发文件的名称设置为.trigger,在所有Spring Boot项目里禁用LiveReload。你可以创建一个.spring-boot-devtools.properties文件,包含如下内容:

spring.devtools.restart.trigger-file=.trigger 
spring.devtools.livereload.enabled=false

相关文章
|
3月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
182 3
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
63 4
|
11天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
201 0
|
18天前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
47 11
|
19天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
36 5
|
17天前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。
|
2月前
|
前端开发 JavaScript Java
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
47 1
|
23天前
|
XML Java 数据格式
Spring Boot 开发中的常见失误
本文深入分析了Spring Boot开发中常见的失误,包括不当使用@Component、@ResponseBody、@Autowired注解,以及不良的异常处理和日志记录实践,提供了有效的规避策略,帮助开发者提升代码质量和系统性能。
|
2月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
52 2
|
4月前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
3186 15