在 .jar 中加载 freemarker 模板文件夹
Posted
技术标签:
【中文标题】在 .jar 中加载 freemarker 模板文件夹【英文标题】:Loading freemarker templates folder inside .jar 【发布时间】:2013-01-23 01:42:25 【问题描述】:我在我的应用程序中使用 freemarker 模板
在将我的应用程序部署到 jar 文件之前,为了加载我的模板,我需要做的就是:cfg.setDirectoryForTemplateLoading(new File("templates"));
它从我在项目中创建的模板文件夹中加载了所有模板。
现在,在迁移到 maven 并将我的应用程序部署到可执行 jar 之后。应用程序再也找不到这个文件夹了(我已经在 .jar 文件中检查过,并且“templates”文件夹部署在根目录中)
我已经尝试了我所知道的一切,但没有运气。
我现在应该如何加载所有模板? (我假设如果我将文件夹放在 .jar 文件之外但在同一目录中它会起作用。但这不是我想要的。)
谢谢。
【问题讨论】:
【参考方案1】:上述的替代方案
cfg.setClassForTemplateLoading(this.getClass(), "/templates");
是
TemplateLoader ldr = new ClassTemplateLoader(classLoader, basePackagePath);
cfg.setTemplateLoader(ldr);
如果您需要从 ftl 处理器所属的 jar 之外的其他 jar 加载内容,这将很有用。
调用cfg.getTemplate(..)
可能会更方便,因为它们只需要相对于basePackagePath
的ftl 路径
【讨论】:
【参考方案2】:Configuration cfg;
private Template template;
cfg=new Configuration();
try
cfg.setClassForTemplateLoading(this.getClass(), "/templates");
template = cfg.getTemplate("template.ftl");
这对我来说非常有效。这里我的模板文件夹包含在 src/main/resources 包下的 template.ftl。
【讨论】:
谢谢,您对资源文件夹的评论对我有用。我错误地将模板放在java/
文件夹的根目录中。【参考方案3】:
看看
void setClassForTemplateLoading(Class cl, String prefix);
...在FreeMarker manual chapter about template loading.
例子:
cfg.setClassForTemplateLoading(this.getClass(), "/templates");
...如果您的模板位于相对于当前类的根目录的templates
包中。
【讨论】:
我明白了,他们实际上在那里谈论这个,但没有关于如何使用它的实际示例。你能帮我举个例子吗 我的模板在 src/main/resources/templates 文件夹中,但是 java 代码在 src/main/java/com/app 包中。在这种情况下,我应该如何引用模板文件夹? 您可以将模板移动到src/main/resources/com/app/templates
或从this.getClass()
更改为XXX.class
,其中XXX
是src/main/java
下的一个类以上是关于在 .jar 中加载 freemarker 模板文件夹的主要内容,如果未能解决你的问题,请参考以下文章
在 java 中加载 freemarker 模板时出现 FileNotFoundException
在 Freemarker 模板中加载模板而不为模板加载设置目录或类
在 Spring Boot / FreeMarker 中加载图像时出现问题