在 Spring Boot 2.1 中热重载 Thymeleaf 模板和资源包

     2023-02-26     29

关键词:

【中文标题】在 Spring Boot 2.1 中热重载 Thymeleaf 模板和资源包【英文标题】:Hot Reloading Thymeleaf Templates and Resource Bundles in Spring Boot 2.1 【发布时间】:2019-07-17 14:33:45 【问题描述】:

我创建了一个启用 i18n 的 Spring Boot 2.1.3 应用程序,添加了开发工具,并安装了 Firefox LiveReload 扩展。不幸的是,当我更改我的 Thymeleaf 模板或 i18n 消息时,它并没有改变。 Spring Boot documentation 似乎暗示您需要做的就是安装 devtools,它会禁用静态资源的缓存。

这是我创建应用程序时所做的:

mkdir bootiful-i18n
cd bootiful-i18n
http https://start.spring.io/starter.zip dependencies==web,thymeleaf -d | tar xvz

然后我创建了一个HomeController.java

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController 

   @GetMapping("/")
   String home() 
       return "home";
   

我在src/main/resources/templates/home.html 创建了一个 Thymeleaf 模板:

<html xmlns:th="http://www.thymeleaf.org">
<body>
   <h1 th:text="#title"></h1>
   <p th:text="#message"></p>
</body>
</html>

我在src/main/resources 中添加了一个messages.properties 文件:

title=Welcome
message=Hello! I hope you're having a great day.

这一切都很好。为了启用热重载,我将 devtools 添加到 pom.xml

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

并安装了LiveReload extension for Firefox。

我重新启动服务器,启用 LiveReload 并导航到 http://localhost:8080。我尝试更改并保存home.htmlmessages.properties 并刷新我的浏览器。浏览器中的输出不会改变。我还需要做些什么来禁用 Spring Boot 2.1 中 Thymeleaf 模板和消息包的缓存吗?

【问题讨论】:

【参考方案1】:

Devtools 将禁用缓存,以便在需要再次渲染模板文件时重新考虑更新。

当您的应用程序在 JVM 进程中启动时,没有任何东西指向您的源文件,它只能看到类路径。因此,您对源文件所做的任何更改都需要更新到类路径位置,这通常通过要求您的 IDE“构建项目”来实现。

因此,模板缺少的步骤是,如果文档对此不清楚,请随时提出建议,因为我们已经对此进行了很多迭代。

但 i18n 并没有什么特别之处。如果您更改它们并更新类路径,我们将重新启动应用程序,而不是像我们为模板所做的那样选择它。我们曾经尝试过支持这一点,请参阅this issue for more details。话虽如此,您不应该期望对资源文件的更改“会起作用”。例如,对配置的更改显然需要重新启动应用程序(同样,通过在使用 devtools 时更新类路径)。

一些关于 IDE 支持的补充说明:

Eclipse 在“保存”时增量编译和复制更改的文件。所以如果你保存你的模板,你应该很高兴 IntelliJ IDEA Ultimate 自 2018.1 起具有 dedicated devtools support - 如果您将“帧停用”配置为“更新资源”,它会在您切换到浏览器时执行正确的操作。在此支持之前,我有一个特殊的按键映射到“构建项目”(增量编译和复制资源),每当我希望我的更改得到反映时,我都会调用它

如果您不使用 IDE,则需要为您更新类路径。我们已经尝试支持开箱即用,但结果证明非常复杂。有a comment to help you if you're using Gradle。

【讨论】:

感谢斯蒂芬妮的建议。我发现 spring.thymeleaf.cachespring.thymeleaf.prefix 都是热重载 Thymeleaf 模板所必需的。对于 i18n,构建或“帧停用更新”(两者都会导致应用重新加载)有效。谢谢! 更正,spring.thymeleaf.prefix 如果您想在不使用 IDE 和 vi 之类的东西时进行热重载,则需要。 spring.thymeleaf.cache 似乎没有必要。【参考方案2】:

将以下内容添加到您的application.properties

spring.thymeleaf.cache=false

【讨论】:

我最近新建了一个项目,父项:spring-boot-starter-parent,依赖项:spring-boot-starter-tomcat,spring-boot-starter-thymeleaf,我编辑时刷新模板他们。虽然我没有尝试过属性。 我必须同时添加 spring.thymeleaf.cachespring.thymeleaf.prefix 才能使热重载工作。 FWIW,当我第一次尝试让事情正常工作时,我正在使用 Vi。也许您正在使用 Eclipse 或在您更改文件时自动更新目标目录的东西?

如何在 ReactJS Docker 中热重载

】如何在ReactJSDocker中热重载【英文标题】:HowtoHot-ReloadinReactJSDocker【发布时间】:2020-08-1723:02:49【问题描述】:这听起来很简单,但我有这个问题。我有两个docker容器正在运行。一个用于我的front-end,另一个用于我的backend服务... 查看详情

如何在 NestJS 中热重载联邦网关

】如何在NestJS中热重载联邦网关【英文标题】:howtohotreloadfederationgatewayinNestJS【发布时间】:2021-08-0809:44:46【问题描述】:问题在联邦嵌套应用程序中,网关会收集来自其他服务的所有模式并形成完整的图表。问题是,子模式改... 查看详情

有没有办法在 Ktor 中热重载静态文件?

】有没有办法在Ktor中热重载静态文件?【英文标题】:Isthereanywaytohot-reloadstaticfilesinKtor?【发布时间】:2020-11-0720:19:45【问题描述】:我一直在关注ktortutorial制作网站,并注意到每次我对资源文件进行更改时,我都必须重新编译... 查看详情

使用 Webpack Dev Middleware 在 Webpack 中热重载 CSS 文件的最简单方法

】使用WebpackDevMiddleware在Webpack中热重载CSS文件的最简单方法【英文标题】:SimplestwaytohotreloadaCSSfileinWebpackusingWebpackDevMiddleware【发布时间】:2016-09-0906:59:04【问题描述】:我有一个用TypeScript编写的项目,我可以利用我的Node.js服务... 查看详情

使用 golang 在 docker 中热重载不起作用(github.com/cosmtrek/air)

】使用golang在docker中热重载不起作用(github.com/cosmtrek/air)【英文标题】:HotReloadnotworkingindockerwithgolang(github.com/cosmtrek/air)【发布时间】:2022-01-1603:45:36【问题描述】:我已经尝试了所有方法都没有解决我的热重载问题,容器会... 查看详情

热重载不起作用,但在 Android Studio 中热重启有效

】热重载不起作用,但在AndroidStudio中热重启有效【英文标题】:Hotreloaddoesn\'tworkbuthotrestartworksinAndroidStudio【发布时间】:2021-05-1600:43:18【问题描述】:我最近开始学习Flutter。我从VisualStudio代码开始,一切正常。我决定尝试Android... 查看详情

具有 Liquibase 重载属性的 Spring-boot

】具有Liquibase重载属性的Spring-boot【英文标题】:Spring-bootwithLiquibaseOverloadingProperty【发布时间】:2014-08-1323:52:45【问题描述】:我正在使用Springboot和Liquibase。使用此网址作为指导http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference... 查看详情

在 org.springframework.security.web.access.expression.WebSecurityExpressionRoot 类型上找不到 Spring Boot Th

】在org.springframework.security.web.access.expression.WebSecurityExpressionRoot类型上找不到SpringBootThymeleafSpringSecurityMethod调用【英文标题】:SpringBootThymeleafSpringSecurityMethodcallcannotbefoundontypeorg.springframework.securi 查看详情

spring-boot-devtools 重载多模块maven项目变更

】spring-boot-devtools重载多模块maven项目变更【英文标题】:spring-boot-devtoolsreloadofmulti-modulemavenprojectchanges【发布时间】:2016-12-2404:58:08【问题描述】:多模块maven项目变更重载设置想象一个多模块的maven项目。项目结构为:pom.xml//pa... 查看详情

Spring Boot 2.1 中的 DataSource bean 覆盖

】SpringBoot2.1中的DataSourcebean覆盖【英文标题】:DataSourcebeanoverridinginspringboot2.1【发布时间】:2019-04-0521:06:03【问题描述】:我已经升级到springboot2.1版本,启动应用程序时出现奇怪的异常。无法注册在类路径资源[org/springframework/bo... 查看详情

Spring boot 2.1 error.html 页面未显示[重复]

】Springboot2.1error.html页面未显示[重复]【英文标题】:Springboot2.1error.htmlpagenotshowing[duplicate]【发布时间】:2019-07-1908:01:27【问题描述】:我使用的是spring-boot2.1.3,我想添加一个错误页面作为后备。我尝试在模板文件夹下添加一个e... 查看详情

Tomcat/Spring boot 重载 META-INF/resources/jsp 文件(实时更新)

】Tomcat/Springboot重载META-INF/resources/jsp文件(实时更新)【英文标题】:Tomcat/SpringbootreloadingMETA-INF/resources/jspfiles(liveupdates)【发布时间】:2017-05-2615:29:10【问题描述】:我在springboot/tomcat实例中使用jsp时遇到问题。基本上,我在模... 查看详情

多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1

】多模块Gradle项目-从Spring-Boot1.5迁移到2.1【英文标题】:Multi-ModuleGradleproject-MigratefromSpring-Boot1.5to2.1【发布时间】:2019-06-2610:13:43【问题描述】:我想将多模块spring-boot1.5项目迁移到spring-boot2.1。这是一个gradle项目(4.9),但不知... 查看详情

Spring boot、maven、AngularJS 2、打字稿和实时重载

】Springboot、maven、AngularJS2、打字稿和实时重载【英文标题】:Springboot,maven,AngularJS2,typescriptandlivereload【发布时间】:2016-01-2518:48:14【问题描述】:我正处于应用程序开发的学习阶段。服务器端开发已经开始,Springboot和Maven。现... 查看详情

使用 Spring-Boot 2.1 从 .yml 读取对象列表 [重复]

】使用Spring-Boot2.1从.yml读取对象列表[重复]【英文标题】:readlistofobjectsfrom.ymlwithSpring-Boot2.1[duplicate]【发布时间】:2019-08-2123:40:48【问题描述】:我需要创建@ConfigurationProperties来读取包含复杂对象列表的.yml文件。Spring-Boot似乎遇... 查看详情

Spring Boot 2.1 嵌入式 Tomcat - 密钥库密码不正确

】SpringBoot2.1嵌入式Tomcat-密钥库密码不正确【英文标题】:SpringBoot2.1embeddedTomcat-keystorepasswordwasincorrect【发布时间】:2019-05-2304:29:53【问题描述】:更新->添加Security.addProvider(newBouncyCastleProvider());修复了这个问题以下错误是由于... 查看详情

带有 Spring Boot 和 websphere 8.5.0.1 的 JPA 2.1

】带有SpringBoot和websphere8.5.0.1的JPA2.1【英文标题】:JPA2.1withSpringbootandwebsphere8.5.0.1【发布时间】:2015-11-2418:41:39【问题描述】:我知道这可能是一个重复的问题,但即使在这里和那里引用了几篇文章,我也无法让它发挥作用。我... 查看详情

vue热重载

...官网使用webpack的HotModuleReplacementAPI,Vuex支持在开发过程中热重载mutation、module、action和getter。你也可以在Browserify中使用browserify-hmr插件。对于mutation和模块,你需要使用store.hotUpdate()方法://store.jsimportVuefrom‘vue‘importVuexfrom‘ 查看详情