Comment # inclure un fichier d'un modèle Velocity en utilisant ClasspathResourceLoader

Je suis à traiter avec un code Java où la Vitesse de 1,7 est définie de façon à extraire des modèles par le biais de la ClasspathResourceLoader. Ci-dessous est une dépouillé exemple de code. C'est à partir d'une Tapisserie de l'application web s'exécutant sur un serveur Jetty.

La classe Java, les modèles et les fichiers à inclure sont tous dans le même dossier "testpackage", donc dans le POT ils sont tous dans le même paquet "testpackage".

Le problème est que si le modèle contient un

#include("MyInclude.vm")

directive, la Vitesse ne peut pas trouver "MyInclude.vm", et il jette un ResourceNotFoundException.

Depuis dans l'argument de getTemplate je doit ajouter le nom du paquet pour le nom de modèle, j'ai aussi essayé de faire la même chose dans le #inclure à l'intérieur du modèle:

#include("testpackage/MyInclude.vm")

mais la seule différence est que ce dernier fonctionne, si je lance l'application web à partir d'Eclipse, alors que l'ancien ne fonctionne pas, même à partir d'Eclipse.
Si j'construire, déployer les Pots et exécuter l'application web du déploiement, les deux syntaxes échouer avec le même ResourceNotFoundException.

La Vitesse de doc à http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html#Include dit:

"Pour des raisons de sécurité, le fichier ne peut être sous
TEMPLATE_ROOT"

Absolument, cela pourrait être la cause de mon problème, mais je n'ai pas été en mesure de trouver plus d'informations sur ce TEMPLATE_ROOT est réellement.

Il ressemble beaucoup à une variable d'environnement, mais je ne sais pas ce que je devrait mettre à, depuis que je suis à l'aide d'un ClasspathResourceLoader, et le fichier à inclure est pas un fichier situé dans un dossier, il est à l'intérieur de la JARRE contenant les modèles et la classe Java (et tous dans le même paquet).

J'ai trouvé TEMPLATE_ROOT mentionné dans une autre question, Où dois-je mettre de la Vitesse les fichiers de modèle pour un utilitaire de ligne de commande intégré avec Maven? , mais c'est lié à l'utilisation d'un FileResourceLoader. J'ai besoin de garder à l'aide de la ClasspathResourceLoader et j'ai besoin de tous les fichiers dans le POT, pas à l'extérieur de la normale de fichiers dans un dossier.

TestVelocity.java

package testpackage;

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

public class TestVelocity
{
  public static String getText()
  {
    String text = "";

    Properties properties = new Properties();

    properties.setProperty("resource.loader", "class");

    properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");

    VelocityEngine engine = new VelocityEngine();

    VelocityContext context = new VelocityContext();

    StringWriter writer = new StringWriter();

    try
    {
      engine.init(properties);

      //This works because the template doesn't contain any #include
      Template template = engine.getTemplate("testpackage/TemplateWithoutInclude.vm");

      //This causes ResourceNotFoundException: Unable to find resource 'TemplateWithInclude.vm'
      //Template template = engine.getTemplate("testpackage/TemplateWithInclude.vm");

      template.merge(context, writer);

      text = writer.toString();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return text;
  }
}

TemplateWithoutInclude.vm

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <p>Hello</p>
    </body>
</html>

TemplateWithInclude.vm

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        #include("MyInclude.vm")
    </body>
</html>

MyInclude.vm

<p>
    Hello
</p>

source d'informationauteur SantiBailors