2010-06-11 137 views
29

我有一個web應用程序,我需要手動獲取Freemarker模板 - 該模板是通過庫項目中的類獲取的,但實際的tpl文件包含在Web應用程序類路徑中。所以,有兩個項目,一個是'taac-backend-api',另一個是'taac-web'。 taac-backend-api具有獲取模板並處理它的代碼,但taac-web是模板存儲的地方(具體位於:WEB-INF/classes/email/vendor.tpl) - 我嘗試了使用將類路徑資源彈出以使用Freemarkers setClassForTemplateLoading方法。我認爲這將工作:從類路徑設置freemarker模板

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

但是,我總是得到一個FileNotFoundException。有人可以解釋從類路徑獲取模板的最佳方式嗎?

謝謝。

回答

71

這是結束了,我的工作:

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

如果您正在使用Struts 2和公約的插件,wuntee的解決方案似乎不工作:依次setClassForTemplateLoading將創建其中沒有按的ClassTemplateLoader實例無論指定什麼路徑前綴,都不會在jar中找到文件。

取而代之,創建一個StrutsClassTemplateLoader的實例。 (我在getTemplateLoader方法中的FreemarkerManager的自定義子類中執行此操作。)它不接受任何參數,因此大概只知道Struts和約定如何執行操作。

+0

根據類加載器層次結構,有時必須仔細考慮您爲「ClassTemplateLoader」指定的類。通常最好的方法是使用'ClassTemplateLoader'構造函數,該構造函數直接使用'ClassLoader'(而不是'Class' - 自2.3.22開始),然後傳入Web應用程序的線程上下文類加載器。 – ddekany 2015-03-14 09:49:53

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

使用此方法來加載從那裏類所在的包中的類,所以如果你的類是

org.foo.SomeClass模板將在/org/foo在類路徑中尋找。這使您的模板與使用/加載它們的類一起存儲。

3

在2017年,以下是棄用:

Configuration conf = new Configuration(); 

我們應該通過freemarker.template.Version的構造器:

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

其中,版本號是指FreeMarker的當前版本。

views該目錄位於src/main/resources