2013-02-07 3 views
13

ich bin mit Freemarker Vorlagen in meiner AnwendungLaden Freemarker Vorlagen Ordner in .jar

vor meiner Anwendung auf eine JAR-Datei bereitstellen, alles, was ich brauchte, um zu tun, um meine Vorlagen zu laden, war dies: cfg.setDirectoryForTemplateLoading(new File("templates"));

welches alle Vorlagen aus dem Vorlagenordner geladen hat, den ich in meinem Projekt erstellt habe.

Jetzt, nach dem Umzug zu Maven und die Bereitstellung meiner Anwendung in eine ausführbare jar. Die Anwendung kann diesen Ordner nicht mehr finden (ich habe in der .jar-Datei nachgesehen und der Ordner "templates" wird direkt im Stammverzeichnis bereitgestellt)

Ich habe alles versucht, was ich weiß. aber ohne Glück.

Wie genau soll ich jetzt alle meine Vorlagen laden? (Ich nehme an, dass, wenn ich den Ordner außerhalb der .jar-Datei, aber im gleichen Verzeichnis, es funktioniert. Aber das ist nicht, was ich will.)

Vielen Dank.

Antwort

23

Werfen Sie einen Blick auf

void setClassForTemplateLoading(Class cl, String prefix); 

... im FreeMarker manual chapter about template loading.

Beispiel:

cfg.setClassForTemplateLoading(this.getClass(), "/templates"); 

... wenn Ihre Vorlagen in dem templates Paket in Bezug auf die Wurzel der aktuellen Klasse befindet.

+0

ich sehe, sie tatsächlich darüber reden dort aber ohne konkretes Beispiel dafür, wie diese zu verwenden. kannst du mir bitte mit einem Beispiel helfen – Gleeb

+0

sehe meine aktualisierte Antwort –

+0

Ich werde es überprüfen. Danke – Gleeb

0
Configuration cfg; 
private Template template; 
    { 
     cfg=new Configuration(); 
     try { 
      cfg.setClassForTemplateLoading(this.getClass(), "/templates"); 
      template = cfg.getTemplate("template.ftl"); 
} 

Das funktionierte perfekt für mich. Hier enthält mein Templates-Ordner template.ftl, das sich im src/main/resources-Paket befindet.

0

Eine Alternative zu dem genannten

cfg.setClassForTemplateLoading(this.getClass(), "/templates"); 

ist

TemplateLoader ldr = new ClassTemplateLoader(classLoader, basePackagePath); 
cfg.setTemplateLoader(ldr); 

, die nützlich sein können, wenn Sie Sachen von anderen Gläsern als die Ihre FTL-Prozessor gehört laden müssen. vielleicht

Anrufe an cfg.getTemplate(..) wird dann bequemer, da sie nur den Weg zum FTL relativ müssen basePackagePath

Verwandte Themen