Impossible de trouver des ressources de modèle de vélocité

Juste une simple application autonome de vitesse basée sur la structure Maven. Voici l’extrait de code écrit en Scala pour rendre le modèle helloworld.vm dans le helloworld.vm ${basedir}/src/main/resources :

 com.ggd543.velocitydemo import org.apache.velocity.app.VelocityEngine import org.apache.velocity.VelocityContext import java.io.SsortingngWriter /** * @author ${user.name} */ object App { def main(args: Array[Ssortingng]) { //First , get and initialize an engine val ve = new VelocityEngine(); ve.init(); //Second, get the template val resUrl = getClass.getResource("/helloworld.vm") val t = ve.getTemplate("helloworld.vm"); // not work // val t = ve.getTemplate("/helloworld.vm"); // not work // val t = ve.getTemplate(resUrl.toSsortingng); // not work yet //Third, create a context and add data val context = new VelocityContext(); context.put("name", "Archer") context.put("site", "http://www.baidu.com") //Finally , render the template into a SsortingngWriter val sw = new SsortingngWriter t.merge(context, sw) println(sw.toSsortingng); } } 

Quand comstackr et exécuter le programme, j’ai eu l’erreur suivante:

 2012-1-29 14:03:59 org.apache.velocity.runtime.log.JdkLogChute log严重: ResourceManager : unable to find resource '/helloworld.vm' in any resource loader. Exception in thread "main" org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource '/helloworld.vm' at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:474) at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:352) at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1533) at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1514) at org.apache.velocity.app.VelocityEngine.getTemplate(VelocityEngine.java:373) at com.ggd543.velocitydemo.App$.main(App.scala:20) at com.ggd543.velocitydemo.App.main(App.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Process finished with exit code 1 

    Grande question – J’ai résolu mon problème aujourd’hui comme suit en utilisant Ecilpse:

    1. Placez votre modèle dans la même hiérarchie de dossiers que votre code source (pas dans une hiérarchie de dossiers distincte, même si vous l’incluez dans le chemin de génération), comme indiqué ci-dessous: Où placer votre fichier modèle

    2. Dans votre code, utilisez simplement les lignes de code suivantes (en supposant que vous souhaitiez simplement que la date soit transmise en tant que données):

       VelocityEngine ve = new VelocityEngine(); ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); ve.init(); VelocityContext context = new VelocityContext(); context.put("date", getMyTimestampFunction()); Template t = ve.getTemplate( "templates/email_html_new.vm" ); SsortingngWriter writer = new SsortingngWriter(); t.merge( context, writer ); 

    Voyez comment nous disons d’abord à VelocityEngine de regarder dans le classpath. Sans cela, il ne saurait pas où chercher.

    Je mets mon fichier .vm sous src/main/resources/templates , puis le code est le suivant:

     Properties p = new Properties(); p.setProperty("resource.loader", "class"); p.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); Velocity.init( p ); VelocityContext context = new VelocityContext(); Template template = Velocity.getTemplate("templates/my.vm"); 

    cela fonctionne dans le projet web.

    Dans eclipse Velocity.getTemplate (“my.vm”), puisque velocity va chercher le fichier .vm dans src / main / resources / ou src / main / resources / templates, mais dans un projet web, nous devons utiliser Velocity.getTemplate (“templates / my.vm”);

    Vous pouvez simplement l’utiliser comme ceci:

     Template t = ve.getTemplate("./src/main/resources/templates/email_html_new.vm"); 

    Ça marche.

    Assurez-vous d’avoir un chargeur de ressources correctement configuré. Voir la documentation Velocity pour savoir comment sélectionner et configurer un chargeur de ressources: http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#resourceloaders

    vous pouvez essayer d’append ces codes:

     VelocityEngine ve = new VelocityEngine(); Ssortingng vmPath = request.getSession().getServletContext().getRealPath("${your dir}"); Properties p = new Properties(); p.setProperty("file.resource.loader.path", vmPath+"//"); ve.init(p); 

    Je fais ça et passe!

     VelocityEngine velocityEngin = new VelocityEngine(); velocityEngin.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); velocityEngin.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); velocityEngin.init(); Template template = velocityEngin.getTemplate("nameOfTheTemplateFile.vtl"); 

    Vous pouvez utiliser le code ci-dessus pour définir les propriétés du modèle de vitesse. Vous pouvez alors donner le nom du fichier tempalte lors de l’initialisation du template et il trouvera s’il existe dans le classpath.

    Toutes les classes ci-dessus proviennent du paquet org.apache.velocity *

    J’ai fait face à un problème similaire avec intellij IDEA. vous pouvez l’utiliser

      VelocityEngine ve = new VelocityEngine(); Properties props = new Properties(); props.put("file.resource.loader.path", "/Users/Projects/Comparator/src/main/resources/"); ve.init(props); Template t = ve.getTemplate("helloworld.vm"); VelocityContext context = new VelocityContext(); 

    Lors de l’utilisation de la jetée intégrée, la propriété webapp.resource.loader.path doit commencer par une barre oblique:

     webapp.resource.loader.path=/templates 

    sinon les modèles ne seront pas trouvés dans ../webapp/templates

    Vous pouvez également placer votre dossier de modèles sous src / main / resources au lieu de src / main / java. Fonctionne pour moi et c’est un emplacement préférable puisque les modèles ne sont pas des sources Java.

    J’ai fait face à un problème similaire. Je copiais les modèles de courrier du moteur de vélocité dans le mauvais dossier. Étant donné que JavaMailSender et VelocityEngine sont déclarés en tant que ressources sous MailService , il est nécessaire d’append les modèles sous le dossier de ressources déclaré pour le projet.

    J’ai apporté les modifications et cela a fonctionné. Placez les gabarits comme

     src/main/resources/templates//sampleMail.vm 

    Juste une simple application autonome de vitesse basée sur la structure Maven. Voici l’extrait de code écrit en Scala pour rendre le modèle helloworld.vm dans

     ${basedir}/src/main/resources folder: