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

Mat*_*ble 1 java spring thymeleaf spring-boot

我创建了一个启用了 i18n 的 Spring Boot 2.1.3 应用程序,添加了 devtools,并安装了 Firefox LiveReload 扩展。不幸的是,当我更改 Thymeleaf 模板或 i18n 消息时,它并没有改变。在春季启动文件似乎表明,所有你需要做的就是安装devtools,它会禁用静态资源的缓存。

这是我为创建应用程序所做的工作:

mkdir bootiful-i18n
cd bootiful-i18n
http https://start.spring.io/starter.zip dependencies==web,thymeleaf -d | tar xvz
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个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";
   }
}
Run Code Online (Sandbox Code Playgroud)

我在以下位置创建了一个 Thymeleaf 模板src/main/resources/templates/home.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
   <h1 th:text="#{title}"></h1>
   <p th:text="#{message}"></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

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

title=Welcome
message=Hello! I hope you're having a great day.
Run Code Online (Sandbox Code Playgroud)

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

为 Firefox安装了LiveReload 扩展

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

Ste*_*oll 5

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

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

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

虽然没有关于 i18n 的具体内容。如果您更改它们并更新类路径,我们将重新启动应用程序,而不是像我们为模板所做的那样选择它。我们曾经尝试过支持这一点,有关更多详细信息,请参阅此问题。话虽如此,您不应该期望对资源文件的更改“会起作用”。例如,对配置的更改显然需要重新启动应用程序(再次,通过在使用 devtools 时更新类路径)。

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

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

如果您不使用 IDE,则需要为您更新类路径。我们试图支持开箱即用,但结果证明非常复杂。如果您使用的是 Gradle ,一条评论可以帮助您