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

标签 java spring spring-boot thymeleaf

我创建了一个启用了 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.

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

<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 模板和消息包的缓存吗?

最佳答案

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

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

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

不过 i18n 没有什么具体的内容。如果您更改它们并更新类路径,我们将重新启动应用程序,而不是像处理模板那样选择它。我们确实尝试过支持一次,请参阅 this issue for more details 。话虽如此,您不应该期望对资源文件的更改“会起作用”。例如,对配置的更改显然需要重新启动应用程序(同样,通过在使用开发工具时更新类路径)。

关于 IDE 支持的一些添加注释:

  • Eclipse 在“保存”时增量编译并复制更改的文件。因此,如果您保存了模板,就可以开始了
  • IntelliJ IDEA Ultimate 有 dedicated devtools support自 2018.1 起 - 如果您将“帧停用”配置为“更新资源”,当您切换到浏览器时,它将执行正确的操作。在此支持之前,我有一个特殊的按键映射到“构建项目”(增量编译和复制资源),只要我希望反射(reflect)我的更改,我就会调用它

如果您不使用 IDE,则需要有一些东西来为您更新类路径。我们尝试过支持这种开箱即用的功能,但结果却相当复杂。有a comment to help you if you're using Gradle .

关于java - Spring Boot 2.1 中热重载 Thymeleaf 模板和资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845023/

相关文章:

Java StringBuilder 巨大的开销

用于测试的 spring junit 加载应用程序上下文

java - 在动态调用上链接方法

java - 多数据库应用SpringBoot、Hibernate和JPA

java - 在方法外部(在类级别)声明的数组和在方法内部赋值的数组不起作用。为什么?

java - Math.max 和 Math.min 会改变它们应用的值吗?

java - 创建镜像时避免内存不足

java - 由于内部联接而不是左联接,Spring DTO 投影查询不会返回所有结果

java - Spring 启动 : How to use WebClient instead of RestTemplate for Performing Non blocking and Asynchronous calls

java - 使用 spring-boot 在 Jpa 查询中出错