戳上方蓝字 “程序猿杂货铺” 关注我
你的关注意义重大!
阅读本文大概需要 10 分钟
原文 | https://dwz.cn/nGLjPvUz
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的 App上面去,即在我们改变了一些代码或者配置文件的时候,应用可以自动重启,这在我们开发的时候,非常有用。 要包含 devtools 支持,需要将 spring-boot-devtools 模块依赖添加到项目构建中,如 Maven 和 Gradle 的以下列表所示: Maven 依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency></dependencies>
运行完整打包的应用程序时,Developer tools 会自动禁用。如果应用以 java -jar 方式启动或特殊的类加载器,应用会被视为 "production application"。在 Maven 中将依赖标记为 optional 是防止 devtools 被应用于使用你工程的其他模块的最佳实践。 打包应用默认不会包含 devtools。
属性默认值
Spring Boot 支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。另外,Spring MVC 可以在服务静态资源时将HTTP缓存头添加到响应中。
虽然缓存在生产中非常有用,但它在开发过程中会起到反作用,使我们无法看到在应用程序中所做的更改。因此,spring-boot-devtools 默认禁用缓存选项。
缓存选项通常由 application.properties 文件中的设置进行配置。例如,如要禁用 Thymeleaf 的缓存功能可以配置 spring.thymeleaf.cache 为 false。引入 spring-boot-devtools 模块后不需要手动设置这些属性,spring-boot自动应用合理的开发时配置。 有关 devtools 自动应用的属性的完整列表,可参阅 DevToolsPropertyDefaultsPostProcessor。
以下是 DevToolsPropertyDefaultsPostProcessor 的部分源码:
@Order(Ordered.LOWEST_PRECEDENCE)public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostProcessor {
private static final Map<String, Object> PROPERTIES;
static { Map<String, Object> devToolsProperties = new HashMap<>(); devToolsProperties.put("spring.thymeleaf.cache", "false"); devToolsProperties.put("spring.freemarker.cache", "false"); devToolsProperties.put("spring.groovy.template.cache", "false"); devToolsProperties.put("spring.mustache.cache", "false"); devToolsProperties.put("server.servlet.session.persistent", "true"); devToolsProperties.put("spring.h2.console.enabled", "true"); devToolsProperties.put("spring.resources.cache.period", "0"); devToolsProperties.put("spring.resources.chain.cache", "false"); devToolsProperties.put("spring.template.provider.cache", "false"); devToolsProperties.put("spring.mvc.log-resolved-exception", "true"); devToolsProperties.put("server.servlet.jsp.init-parameters.development", "true"); devToolsProperties.put("spring.reactor.stacktrace-mode.enabled", "true"); PROPERTIES = Collections.unmodifiableMap(devToolsProperties); }
自动重启
当类路径上的文件发生更改时,使用 spring-boot-devtools 的应用程序会自动重新启。在 IDE 中工作时,这是一个非常有用的功能,因为它为代码更改提供了非常快速的反馈。
由于 DevTools 监控类路径资源,触发重启的唯一方法是更新类路径。导致类路径更新的方式取决于您使用的IDE。在 Eclipse 中,保存修改后的文件会导致更新类路径并触发重新启动。在 IntelliJ IDEA 中,构建项目(Build -> Build Project)具有相同的效果,但实际开发中不可能每次改动后都手动 Build,因此需要设置 Idea 的自动编译。 File --> Settings --> Compiler --> Build Project automatically
ctrl + shift + alt + / --> Registry --> Compiler autoMake allow when app running
Spring Boot 提供的重启技术通过使用两个类加载器来工作。不改变的类(例如来自第三方jar的类)被加载到baseclassloader 中。我们正在开发的类会加载到 restart classloader 中。当应用程序重新启动时,restartclassloader 将被丢弃并创建一个新类。这种方法意味着应用程序重启通常比 "cold starts" 快得多,因为基类加载器已经可用并且已经被填充。
某些资源不一定需要在更改时触发重新启动。例如,可以就地编辑 Thymeleaf 模板。默认情况下,在改变资源
/META-INF/maven,/META-INF/resources,
/resources,/static,/public,或 /templates 不会触发重启但并触发 重新加载。可以使用 spring.devtools.restart.exclude 属性来自定义排除的资源。例如,要仅排除 /static,/public 可以设置以下属性:
spring.devtools.restart.exclude=static/**,public/**
如上所述,DevTools 监控类路径资源的变动,但如果我们想更改不在类路径中的文件时重新启动或重新加载应用程序,该怎么办呢?这是可以使用 spring.devtools.restart.additional-paths 属性来配置其他路径以监视更改。
Spring Boot 项目热部署方式还有一种就是使用spring loaded。 在 spring-boot-maven-plugin 中添加 springloaded 依赖
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies></plugin>
项目以 mvn spring-boot:run 方式启动即可完成热部署 再就是不添加依赖,直接将 springloaded jar 包下载下来,然后以 java 应用方式启动,只不过要配置一下 Run Configuration 将 VM options 配置为 -javaagent:C:springloaded-1.2.6.RELEASE.jar -noverify(其中C:springloaded-1.2.6.RELEASE.jar 为你自己jar所在位置)