You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Gradle多模块项目无法找到自定义Mustache模板路径问题

问题根因

多模块模式启动Spring Boot项目时,默认会以根项目的工作目录作为运行根目录,嵌入式Tomcat不会自动识别各子模块下的src/main/webapp路径,会自动生成临时的docbase目录,因此找不到存放在子模块webapp下的Mustache模板。单模块运行时工作目录就是子模块本身的根目录,所以可以正常读取。


可选解决方案

方案1:修改IDE启动配置的工作目录(最简单,适合开发环境)

  • 打开你对应子模块启动类的运行配置,将Working directory参数修改为当前子模块的根目录(比如D:\Java\项目名\子模块名),和单模块运行时的工作目录保持一致即可。
  • 如果需要同时启动多个子模块,分别给每个子模块的启动类配置对应的工作目录即可。

方案2:调整模板存放路径(最推荐,全环境兼容)

  • 将各子模块下的Mustache模板从src/main/webapp/WEB-INF/templates迁移到src/main/resources/templates目录下
  • 修改子模块application.yml中的Mustache配置,将spring.mustache.prefix改为classpath:/templates/
  • 该方案不需要额外配置,Spring会自动从classpath下加载模板,不管是开发环境单/多模块运行,还是打包成jar包生产环境运行,都不会出现路径找不到的问题。

方案3:自定义Tomcat docbase路径(适合必须保留webapp目录的场景)

如果项目有特殊要求必须把模板放在webapp目录下,可以在子模块启动类中显式指定开发环境的docbase路径,代码示例:

@SpringBootApplication
public class DemoSubApplication implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    public static void main(String[] args) {
        SpringApplication.run(DemoSubApplication.class, args);
    }

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        // 仅开发环境生效,避免影响生产环境打包运行
        if (Arrays.stream(Environment.getActiveProfiles()).anyMatch("dev"::equals)) {
            // 替换为你当前子模块的webapp相对路径
            File webappDir = new File("./demo-sub/src/main/webapp");
            if (webappDir.exists()) {
                factory.setDocumentRoot(webappDir);
            }
        }
    }
}

方案4:关闭模板位置检查(仅屏蔽警告,不推荐)

如果不想修改现有配置,只需要消除警告日志,可以在子模块的application.yml中添加配置:

spring:
  mustache:
    check-template-location: false

该方案只是跳过了路径存在性检查,没有实际解决路径问题,后续如果真的出现模板路径配置错误也不会有提示。


内容的提问来源于stack exchange,提问作者I have 10 fingers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:09:03