2013-02-07 3 views
13

sto usando modelli FreeMarker nella mia richiestaCaricamento cartella dei modelli FreeMarker all'interno .jar

prima di distribuire la mia domanda di un file jar, tutto quello che dovevo fare per caricare i miei modelli era questo: cfg.setDirectoryForTemplateLoading(new File("templates"));

che ha caricato tutti i modelli dalla cartella dei modelli che ho creato all'interno del mio progetto.

Ora, dopo essersi trasferito a Maven e aver distribuito la mia applicazione in un jar eseguibile. L'applicazione non riesce più a trovare questa cartella (ho controllato all'interno del file .jar e la cartella "templates" è distribuita direttamente nella directory root)

ho provato tutto quello che so. ma senza fortuna.

esattamente come dovrei caricare tutti i miei modelli ora? (Suppongo che se metto la cartella fuori dal file .jar ma nella stessa directory funzionerà, ma non è quello che voglio.)

Grazie.

risposta

23

Dai un'occhiata alla

void setClassForTemplateLoading(Class cl, String prefix); 

... nel FreeMarker manual chapter about template loading.

Esempio:

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

... se i modelli si trova nel templates pacchetto relativo alla radice della classe corrente.

+0

vedo, in realtà parlare di questo lì, ma senza esempio reale di come utilizzare questo. potete per favore aiutarmi con un esempio – Gleeb

+0

vedere la mia risposta aggiornata –

+0

Verificherò. Grazie – Gleeb

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

Questo ha funzionato perfettamente per me. Qui la mia cartella templates contiene template.ftl che si trova sotto il pacchetto src/main/resources.

0

Un'alternativa al citato

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

è

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

che può essere utile se avete bisogno di caricare roba da altri vasi di quello processore FTL appartiene.

chiamate verso cfg.getTemplate(..) saranno allora forse essere più conveniente come hanno solo bisogno il percorso del FTL rispetto al basePackagePath