在.jar文件中加载freemarker模板文件夹

23

我正在使用Freemarker模板在我的应用程序中。

在将我的应用程序部署到JAR文件之前,我只需要执行以下操作即可加载我的模板:cfg.setDirectoryForTemplateLoading(new File("templates"));

这将从我在项目内创建的“templates”文件夹中加载所有模板。

现在,我已经转向Maven并将应用程序部署到可执行的jar后。 应用程序无法再找到此文件夹(我已经在.jar文件中检查过,“templates”文件夹直接部署在根目录中)

尽管我尝试了所有我所知道的方法,但仍然没有任何运气。

我现在应该如何加载我所有的模板? (我假设如果我将文件夹放在.jar文件之外但是在同一个目录中,那么它将起作用,但这不是我想要的。)

谢谢。

3个回答

32

看一看

void setClassForTemplateLoading(Class cl, String prefix);

...在FreeMarker手册中有关模板加载的章节

示例:

cfg.setClassForTemplateLoading(this.getClass(), "/templates");

如果您的模板位于当前类的根目录下的 templates 包中。


我明白了,他们确实在那里谈论这个问题,但没有给出具体的使用示例。你能否帮我提供一个例子? - Gleeb
我的模板文件在src/main/resources/templates文件夹中,但是Java代码在src/main/java/com/app包中。在这种情况下,我应该如何引用模板文件夹? - yathirigan
你可以将你的模板移动到 src/main/resources/com/app/templates 或者将 this.getClass() 更改为 XXX.class,其中 XXX 是在 src/main/java 目录下的一个类。 - Werner Kvalem Vesterås

5
Configuration cfg;
private Template template;  
    {
        cfg=new Configuration(); 
        try {
            cfg.setClassForTemplateLoading(this.getClass(), "/templates");
            template = cfg.getTemplate("template.ftl");
}

这对我来说非常完美。在我的模板文件夹中,包含了一个名为template.ftl的文件,该文件位于src/main/resources包下。


谢谢,你关于资源文件夹的评论对我很有帮助。我错误地将模板放在了 java/ 文件夹的根目录下。 - Felipe Wagner

1
一种替代方案是所提到的


cfg.setClassForTemplateLoading(this.getClass(), "/templates");

TemplateLoader ldr = new ClassTemplateLoader(classLoader, basePackagePath);
cfg.setTemplateLoader(ldr);

这将非常有用,如果您需要从与您的ftl处理器不属于同一个jar的其他jar中加载内容。
调用cfg.getTemplate(..)可能会更方便,因为它们只需要相对于basePackagePath的ftl路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接