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 中加载模板的位置的主要内容,如果未能解决你的问题,请参考以下文章
maven中使用freemarker,如何配置需要哪些配置文件
maven搭建springboot+mybatis+freemarker