如何从Maven依赖中引用Mustache模板?
从Maven依赖中复用Mustache模板的实现方案
一、先确保模板在Maven库中的正确存放
把Cookie横幅模板放在Maven库项目的src/main/resources/templates/目录下(或直接在src/main/resources/根目录),Maven默认的maven-resources-plugin会自动把这些资源打包进jar包,微服务引入依赖后就能通过类路径访问到。
二、从类路径加载模板(主流实现示例)
Java生态中常用的Mustache库(JMustache、Mustache.java)都支持从类路径加载模板,之前加载失败大概率是路径配置问题,以下是两种实现的正确写法:
JMustache 加载示例
import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; // 从类路径加载模板,路径对应resources下的位置 Template cookieBanner = Mustache.compiler() .compile(Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/cookie-banner.mustache"));
Mustache.java 加载示例
import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; MustacheFactory mf = new DefaultMustacheFactory(); // 直接指定类路径下的模板完整路径 Mustache cookieBanner = mf.compile("templates/cookie-banner.mustache");
如果模板放在resources根目录,路径直接写cookie-banner.mustache即可。
三、将库中模板作为部分模板引用
要在微服务的主模板中调用这个Cookie横幅,核心是让Mustache编译器能从类路径(包括Maven依赖的jar)中找到部分模板,不同库的配置方式如下:
JMustache 配置部分模板加载器
自定义模板加载器,让编译器优先从类路径查找部分模板:
import com.samskivert.mustache.Mustache; import com.samskivert.mustache.TemplateLoader; TemplateLoader classpathLoader = name -> { String templatePath = "templates/" + name; InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(templatePath); return is != null ? new InputStreamReader(is) : null; }; // 初始化编译器时绑定加载器 Mustache.Compiler compiler = Mustache.compiler().withLoader(classpathLoader); // 编译主模板 Template mainTemplate = compiler.compile("main-template.mustache");
然后在主模板main-template.mustache中直接用Mustache的部分模板语法引用:
<!-- 主模板内容 --> <div class="page-content">...</div> <!-- 引用库中的Cookie横幅 --> {{> cookie-banner.mustache}}
Mustache.java 配置模板工厂
DefaultMustacheFactory默认支持从类路径查找模板,只需指定模板根目录即可:
// 指定模板根目录为resources下的templates文件夹 MustacheFactory mf = new DefaultMustacheFactory("templates"); Mustache mainTemplate = mf.compile("main-template.mustache");
主模板中同样用{{> cookie-banner.mustache}}引用,只要依赖jar中的模板在对应路径下,就能被自动加载。
四、常见问题排查
- 模板找不到:用
jar tf your-library.jar命令检查依赖jar中是否包含模板文件;确认代码中的路径与实际存放路径一致(注意Linux系统下类路径区分大小写)。 - 部分模板不渲染:检查模板编译器的加载器配置是否覆盖了类路径;确认部分模板的语法
{{> 模板名}}没有拼写错误。 - 资源未打包:如果Maven库的jar中没有模板,检查pom.xml是否有自定义的
maven-resources-plugin配置,确保src/main/resources下的资源被正确打包。
内容的提问来源于stack exchange,提问作者Malachi Spencer
相关产品推荐
相关产品推荐

