我尝试了在本文和文档中找到的所有技巧和窍门,但还是没有运气。我有Thymeleaf的Spring webapp。当我在IDEA中调用update时,不会重新加载资源和模板(它什么也没说要重新加载)。然后,我可以在疯狂的浏览器中按ctrl + f5,只是不存在更改。
一切都在一个Java类中进行配置,如下所示:
@EnableWebMvc public class MvcConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
我的文件夹结构现在看起来像 这样,但我也尝试将资源放置在没有“静态”文件夹或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 = false:
spring.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文件不是,我必须为此重新启动服务器。实际上* .html文件没什么大不了的,但是在每一次小的css和js更改后重新启动服务器都会使我的工作减慢很多,而且由于我花了将近15个小时来弄清楚问题出在哪里,这真令人沮丧。
任何帮助将不胜感激。
我花了一些时间,最后在这里我将解释如何使它工作。到处搜寻您可能会发现一些资讯:
我的初始方法是禁用缓存并添加Spring开发工具:
spring靴 application.properties
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使用基于文件系统的解析器来覆盖:
defaultTemplateResolver
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键 来重新加载更改 :)