IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Velocity] Charger les templates par le classloader


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut [Velocity] Charger les templates par le classloader
    Bonjour,

    Voici mon problème. Je précise que je ne suis pas en environnement Web mais seulement J2EE/EJB.

    J'utilise Velocity pour générer des scripts hexadécimaux via une classe utilitaire : on lui passe le nom du fichier de template et les paramêtres, elle renvoit le script.

    Je charge les fichiers par le Classloader car il est impossible d'utiliser le FileClassLoader ni le JarClassLoader : environnement de tests, multi plateforme ...

    La classe cherche ce template à la racine du classloader et si elle ne le trouve pas, elle le cherche dans son propre package où il y a les templates par défaut.

    Je fais avec JUnit des tests unitaires puis des tests systèmes (dans Glassfish). Les tests systèmes fonctionnent, le principe d'écrasement du template par défaut fonctionne.

    En revanche pas moyen de faire marcher les tests unitaires, que ce soit directement dans Eclipse ou via le script ant qui est lancé lors du build automatique. Les traces m'indiquent pourtant que la classe cherche le template au bon endroit !!! D'autant plus étrange que les propriétés Velocity sont situées au même endroit que les templates par défaut, et sont bien trouvés.

    Si qqun pouvait m'aider, merci. Ci dessous les sources en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public static String generateScript(String templateName, Map<String, String> params) {
            try {
     
                InputStream is = ScriptProcessor.class.getResourceAsStream("velocity.properties"); 
     
                Properties properties = new Properties();
                properties.load(is);
                is.close();
     
                Velocity.init( properties );
     
                VelocityContext context = new VelocityContext();
                if (params!=null && !params.isEmpty ()) {
                    for (String key : params.keySet ()) {
                        context.put (key, params.get (key));
                    }        
                }
     
                StringWriter sw = new StringWriter();
     
                String EMBEDDED_TEMPLATE_PATH = "com/developper/velocity/";
     
                if (!Velocity.resourceExists (templateFile)) {
                    templateName = EMBEDDED_TEMPLATE_PATH + templateName;
                }
     
                Velocity..mergeTemplate(templateName,  "UTF-8", context, sw );
     
                String script = sw.toString ();
     
                return script;
            } catch (Exception e) {
                log.error("Error while using template to generate the script", e);
                return "";
            }
        }
    L'arborescence des sources est :

    com/developper/velocity/
    ScriptProcessor
    velocity.properties
    templateA.vm
    templateV.vm
    TestScriptProcessor
    Et l'erreur est :

    org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'com/developper/velocity/templateA.vm'
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:452)
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:335)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1102)
    at org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:498)
    at com.developper.velocity.ScriptProcessor.generateScript(ScriptProcesso
    Merci de m'aider car là je sèche complêtement.

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 870
    Par défaut
    Salut,

    Je pense que ton problème est lié au classpath.
    De plus, quand tu écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStream is = ScriptProcessor.class.getResourceAsStream("velocity.properties");
    ça sous entend que ton fichier velocity.properties se trouve à la racine d'un de tes chemins de ton classpath, hors apparement ce n'est pas le cas.

    Le bon chemin, serait "com/developper/velocity/velocity.properties".

    Il faut vérifier que lors de tes tests unitaires tu inclus bien le bon classpath.

    A+

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut
    Comme je l'ai précisé, je n'ai aucun problème pour charger le fichier properties qui n'est pas à la racine du classpath mais au même niveau que la classe. Je peux même afficher les propriétés que je ramène.

    Si je fais un new File("com/developper/velocity/templateA.vm"), il trouve le fichier et je peux le manipuler.

    J'ai l'impression que c'est vraiment Velocity qui s'emmèle les pinceaux et je ne trouve pas de problèmes similaires car sur le site Velocity : 95% des questions du forum sont dans un contexte web (avec WEB-INF/classes)...

  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 870
    Par défaut
    Regarde du coté de la propriété "file.resource.loader.path"; Il se peut que tu doives la renseigner avec le path vers ta template.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut
    Malheureusement, "file.resource.loader.path" n'est applicable que pour le FileResourceLoader et le JarResourceLoader. Et je ne peux pas les utiliser car ils réclament des chemins absolus et l'application est destinée aux environnements Windows et Unix.


    Je commence à me décourage, je vais soumettre ma problématique de plus haut

    J'ai besoin de générer des scripts grâce à un template. Ce template par défaut, présent dans le jar, doit pouvoir être écrasé au runtime par une version modifiée qu'on collerait qq part sur le serveur. Et j'ai besoin que ça marche aussi en dehors du contexte serveur pour les tests unitaires.

    Je suis ouvert à toute proposition de solution technique java simple à mettre en oeuvre. Je vais regarder du côté de StringTemplate déjà. Merci.

Discussions similaires

  1. [1.x] Modifier les templates autogénérés par l'admin
    Par noreaga10 dans le forum Symfony
    Réponses: 3
    Dernier message: 30/01/2010, 12h05
  2. [ClassLoader]Charger les classes d'un Jar
    Par GLDavid dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2007, 17h22
  3. Réponses: 3
    Dernier message: 10/09/2007, 09h18
  4. [Smarty] Qu'entend-on par cache dans les templates
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 06/12/2006, 11h38
  5. [SERVLET][JDBC] Impossible de charger les pilotes
    Par cedric.picard dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/10/2004, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo