Freemarker 在 maven 生成的 jar 中加载模板的位置

Posted

技术标签:

【中文标题】Freemarker 在 maven 生成的 jar 中加载模板的位置【英文标题】:Where does Freemarker load templates in a maven generated jar 【发布时间】:2018-11-01 20:25:27 【问题描述】:

让我澄清一下我目前的做法。我有一个 maven 项目,包架构如下所示:src/main/java/com/gearon/app/App.java src/main/java/com/gearon/app/configuration/Config.java src/main/java/com/gearon/app/datamodel/*.java

我尝试使用以下代码在 Config.java 中设置加载模板的目录:

    cfg = new Configuration();
    cfg.setClassForTemplateLoading(Config.class, "/templates");
    cfg.setDefaultEncoding("UTF-8");
    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

我已将模板放在 src/main/java/com/gearon/app/templates 下 架构是src/main/java/com/gearon/app/templates/*.ftl

如果我直接使用 main 方法运行代码,它工作正常。但是,当我将项目打包到 jar 中时,它无法加载模板,并且错误如下所示:

java.io.FileNotFoundException: Template "index.ftl" not found.

我想知道把这些模板放在哪里。

【问题讨论】:

与您的问题无关,但您使用的是旧的 FreeMarker 版本(我从错误消息中看到)。较新的有更多有用的错误消息等。 @ddekany 谢谢。我想在将来升级它。 【参考方案1】:

嗯,基于对来自Freemarker official site的手册的研究

void setClassForTemplateLoading(Class cl, String basePackagePath) 和 无效 setClassLoaderForTemplateLoading(类加载器类加载器,字符串 basePackagePath):这些是用于当您想通过以下方式加载模板时 Java 加载类的机制相同(从类路径, 正如他们过去模糊地说的那样)。这很可能是首选 为生产代码加载模板的方法,因为它允许您 将所有内容保存在部署 jar 文件中。第一个参数 决定将使用哪个 Java ClassLoader。第二个参数 指定包含模板的包,以 / 分隔 格式。注意如果不以/开头,会被解释 相对于Class参数的封装。

注意事项很重要:

注意,如果不以/开头,会被解释 相对于Class参数的封装。

更改后cfg.setClassForTemplateLoading(Config.class, "/templates");cfg.setClassForTemplateLoading(Config.class, "templates");

一切都像魅力一样完美。

【讨论】:

以上是关于Freemarker 在 maven 生成的 jar 中加载模板的位置的主要内容,如果未能解决你的问题,请参考以下文章

Freemarker 模板引擎和 Maven

maven中使用freemarker,如何配置需要哪些配置文件

maven搭建springboot+mybatis+freemarker

Maven+SpringMVC+Freemarker入门Demo

Freemarker 配置问题(Maven 编译失败)

161213Maven资源替换和Freemarker模板