我尝试了我在这里和文档中找到的所有提示和技巧,但仍然没有运气。我有Thymeleaf的Spring webapp。当我在IDEA中调用update时,不会重新加载资源和模板(它没有重新加载)。然后我可以在浏览器中按ctrl + f5一样疯狂,改变就不存在了。
所有内容都在一个Java类中配置,如下所示:
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
我的文件夹结构现在看起来像 this,但我也尝试将资源放在没有"静态"文件夹或webapp / resources。
ResourceHandlerRegistry:
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
registry.addResourceHandler("/img/**").addResourceLocations("classpath:/static/img/");
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
}
我在application.properties:
中都指定了cache = falsespring.thymeleaf.cache=false
并在提到的MvcConfig类中:
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(this.applicationContext);
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCacheable(false);
return templateResolver;
}
根据SO的一些答案,我添加了对devtools的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.4.1.RELEASE</version>
<optional>true</optional>
</dependency>
仍然无法正常工作。有人说用addResources = true添加maven启动插件,所以我做了:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.1.RELEASE</version>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
我的想法设置正确我猜,因为当我调用update时,我的Java类会立即重新加载。只有资源和html文件不是,我必须为它重新启动服务器。 Actualy * .html文件并不是什么大不了的事,但是在每次小css和js更改之后重新启动服务器会让我失望很多,而且当我丢失了将近15个小时弄清楚什么是错误时,它开始真的很令人沮丧。
非常感谢任何帮助。
答案 0 :(得分:8)
我花了一些时间在这里,最后在这里我将解释我是如何运作的。 在Google上搜索可能会找到几个信息:
我的初衷是禁用缓存并添加Spring开发工具:
Spring boot application.properties
spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.prefix=/templates/
的pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
然而,使用上面的代码段是不够的,因为只有在制作项目时才进行热交换(Intellij Idea中的CTRL + F9)。这是因为默认模板解析器是基于类路径的,这是重新编译所必需的原因。
工作解决方案是使用基于文件系统的解析程序覆盖defaultTemplateResolver
:
application.properties
spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.templates_root=src/main/resources/templates/
申请类
@SpringBootApplication
public class MyApplication {
@Autowired
private ThymeleafProperties properties;
@Value("${spring.thymeleaf.templates_root:}")
private String templatesRoot;
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean
public ITemplateResolver defaultTemplateResolver() {
FileTemplateResolver resolver = new FileTemplateResolver();
resolver.setSuffix(properties.getSuffix());
resolver.setPrefix(templatesRoot);
resolver.setTemplateMode(properties.getMode());
resolver.setCacheable(properties.isCache());
return resolver;
}
}
我发现此解决方案是最佳的,因为它允许您外部化配置并使用不同的配置文件(dev,prod等等),同时通过按F5重新加载更改的好处:)
答案 1 :(得分:0)
好的,所以我找到了回答我的具体案例。在我的应用程序或它的配置中没有问题(很可能)。我没有使用 Tomcat 8.5.5 ,而是切换回 Tomcat 7 。现在一切正常。有人知道为什么吗?
答案 2 :(得分:0)
这是我在IntelliJ IDEA(2018.3)中的设置,保存更改后将重新加载HTML:
在application.properties中:
spring.resources.static-locations = classpath:/resources/static
spring.resources.cache.period = 0
在pom.xml中,设置<addResources>true</addResources>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
菜单Run
=> Edit Configurations
(IntelliJ IDEA)
停用帧:Update resources
答案 3 :(得分:0)
@Luke,我的解决方案非常简单:
要在Spring Thymeleaf中自动重新加载HTML / CSS / JS可能很简单且没有错误,只有在IntelliJ中进行了测试。
将此添加到maven,使用$ {spring.version} var或替换为您的版本:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.version}</version>
<optional>true</optional>
<scope>runtime</scope>
</dependency>
添加到html标头中:
<script src="http://localhost:35729/livereload.js"></script>
使用IntelliJ时: