0

我正在尝试使用 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/”,这就是我使用“.”的原因。当前位置路径。

4

1 回答 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不知道罐子的位置,或者根本不知道是否涉及罐子。它只是要求 JavaClassLoader定位和加载资源。

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

于 2019-04-01T16:10:29.303 回答