从外部classpath / jar加载Freemarker模板

时间:2019-04-01 12:54:33

标签: java templates freemarker

我正在尝试使用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 /”这样的硬编码路径,这就是为什么我使用“。”。当前位置路径。

1 个答案:

答案 0 :(得分: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-是完全独立的虚拟目录树,彼此之间并不了解。只是MultiTemplateLoader通过我刚刚展示的后备机制将两棵树相互覆盖。

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

还要注意,使用new File(".")通常不是一个好主意,因为在大多数应用程序中,您无法很好地控制创建TemplateLoader时的当前工作目录。通常,您会在某些配置文件中使用绝对路径,或者将其作为命令行参数传入。 FreeMarker不在乎您如何做。