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