我正在尝试使用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 /”,这就是我使用“。”的原因。当前位置路径。
可以从几乎任何地方加载模板,也可以从多个位置加载模板。但我怀疑这里有一些误解。
只有一个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并不关心你如何做到这一点。