在 .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,其中XXXsrc/main/java 下的一个类

以上是关于在 .jar 中加载 freemarker 模板文件夹的主要内容,如果未能解决你的问题,请参考以下文章

在 java 中加载 freemarker 模板时出现 FileNotFoundException

在 Freemarker 模板中加载模板而不为模板加载设置目录或类

在 Spring Boot / FreeMarker 中加载图像时出现问题

如何在 Keycloak .ftl 模板中加载用户数据?

Spring Boot FreeMarker:如何动态使用自定义模板?

几个 jar 中的 freemarker 模板