Freemarker在maven生成的jar中加载模板的位置

让我澄清一下我目前的做法。 我有一个maven项目,包架构如下所示:
的src / main / JAVA / COM / gearon /应用/ App.java
的src /主/ JAVA / COM / gearon /应用/配置/ Config.java
的src / main / JAVA / COM / gearon /应用程序/数据模型/ *。java的

我尝试使用下面的代码设置目录在Config.java中加载模板的目录:

cfg = new Configuration(); cfg.setClassForTemplateLoading(Config.class, "/templates"); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); 

我把模板放在src / main / java / com / gearon / app / templates下
该体系结构是src / main / java / com / gearon / app / templates / * .ftl

如果我直接用main方法运行代码,它工作正常。 但是,当我将项目打包到jar中时,它无法加载模板,错误如下所示:

 java.io.FileNotFoundException: Template "index.ftl" not found. 

我想知道把那些tempaltes放在哪里。

嗯,基于Freemarker官方网站的手册研究

void setClassForTemplateLoading(Class cl,String basePackagePath)和void setClassLoaderForTemplateLoading(ClassLoader classLoader,String basePackagePath):当你想通过Java加载类的相同机制加载模板时(来自类路径,就像他们以前说的那样)依稀)。 这很可能是为生产代码加载模板的首选方法,因为它允许您将所有内容保存在部署jar文件中。 第一个参数决定使用哪个Java ClassLoader。 第二个参数以/分离格式指定包含模板的包。 请注意,如果不使用/启动它,它将相对于Class参数的包进行解释。

注意事项是重要的:

请注意,如果不使用/启动它,它将相对于Class参数的包进行解释。

改变之后
cfg.setClassForTemplateLoading(Config.class, "/templates");

cfg.setClassForTemplateLoading(Config.class, "templates");

一切都很好,就像一个魅力。