从classpath / jar外部加载Freemarker模板

问题描述 投票:0回答:1

我正在尝试使用FreeMarker为在我的应用程序中工作的不同代理生成报告。我在线查看,但如果可以加载模板,如果它们不在我项目的资源文件夹中,则无法找到。当我的应用程序从我试图使用的* .jar文件运行时:

public ReportTemplate(final String template_path)
        throws TemplateException, IOException {
    CFG.setDirectoryForTemplateLoading(new File("."));
    CFG.setDefaultEncoding("UTF-8");
    template = CFG.getTemplate(template_path);
}

然后在我传递模板的conf文件中:

parameters: {
    report: /../test.ftl
}

* .jar文件和模板在同一个文件夹中,但据我所知,我首先需要退出jar文件,然后去获取模板。我想知道是否有一种简单的方法来加载FreeMarker模板而不将它们放在我项目的/ resources /文件夹中(这样当别人使用该应用程序时,他可以设计自己的模板并将其复制到文件夹中)。我也不想使用硬编码路径,如“/ tmp /”,这就是我使用“。”的原因。当前位置路径。

java templates freemarker
1个回答
1
投票

可以从几乎任何地方加载模板,也可以从多个位置加载模板。但我怀疑这里有一些误解。

只有一个cfg.templateLoader财产。 cfg.setDirectoryForTemplateLoading(dir)只是cfg.setTemplateLoader(new FileTemplateLoader(dir))的便利速记,而cfg.setClassForTemplateLoading(...)只是cfg.setTemplateLoader(new ClassTemplateLoader(...))的便利速记。如果需要使用两种机制(从任意目录和Java类路径上的jar-s)加载,则需要使用cfg.setTemplateLoader(new MultiTemplateLoader(new TemplateLoader[] { new FileTemplateLoader(dir), new ClassTemplateLoader(...) }))。现在,如果您尝试加载foo/bar.ftl,首先FileTemplateLoader将尝试相对于其自己的基本目录加载foo/bar.ftl,如果找不到,那么ClassTemplateLoader将尝试相对于其自己的基础包加载foo/bar.ftl。两个TemplateLoader-s是完全独立的虚拟目录树,彼此不了解。只是MultiTemplateLoader通过我刚刚展示的后备机制将两棵树叠加在一起。

另请注意,ClassTemplateLoader不知道罐子的位置,或者是否涉及罐子。它只是要求Java ClassLoader定位和加载资源。

另请注意,使用new File(".")通常是个坏主意,因为在大多数应用程序中,您无法很好地控制创建TemplateLoader时当前工作目录的内容。通常,您在某个配置文件中有一个绝对路径,或者它作为命令行参数传入。 FreeMarker并不关心你如何做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.