从classpath设置freemarker模板

时间:2010-06-11 00:10:45

标签: freemarker

我有一个Web应用程序需要手动获取Freemarker模板 - 模板是通过库项目中的类获得的,但实际的tpl文件包含在Web应用程序类路径中。因此,有2个项目,一个是“taac-backend-api”,另一个是“taac-web”; taac-backend-api有代码来获取模板并对其进行处理,但是taac-web是模板存储的地方(具体在:WEB-INF / classes / email / vendor.tpl) - 我已尝试过使用的一切使用Freemarkers setClassForTemplateLoading方法弹出classpath资源。我认为这样可行:

    freemarkerConfiguration = new Configuration();
    freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
    Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl");

然而,我总是得到一个FileNotFoundException。有人可以解释从类路径获取模板的最佳方法吗?

感谢。

5 个答案:

答案 0 :(得分:75)

最终为我工作的是:

freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");

答案 1 :(得分:4)

freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");

使用此方法从您的类所在的包中加载类,因此如果您的类是

org.foo.SomeClass将在类路径的/org/foo中查找模板。这使您的模板与使用/加载它们的类一起存储。

答案 2 :(得分:3)

2017年,不推荐使用以下内容:

myMessages

我们应该将Configuration conf = new Configuration(); 传递给构造函数:

freemarker.template.Version

其中版本号指的是当前版本的FreeMarker。

Configuration conf = new Configuration(new Version(2, 3, 23)); conf.setClassForTemplateLoading(Application.class, "/views"); 目录位于views

答案 3 :(得分:0)

如果您正在使用Struts 2和Conventions插件,wuntee的解决方案似乎不起作用:setClassForTemplateLoading反过来创建ClassTemplateLoader的实例,无论在什么内容都找不到jar中的文件路径前缀已指定。

而是创建StrutsClassTemplateLoader的实例。 (我在其FreemarkerManager方法中的getTemplateLoader自定义子类中执行此操作。)它不需要任何参数,因此可能只知道Struts和约定是如何做的。

答案 4 :(得分:0)

使用以下配置并将其放在应用程序属性中。

spring.freemarker.template-loader-path=