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

Maven Java Discussion :

Problème de context Spring avec les différents répertoires main et test


Sujet :

Maven Java

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut Problème de context Spring avec les différents répertoires main et test
    Bonjour à tous,

    Je suis actuellement en train d'adapter mon application Web Spring à la structure Maven.

    Au début, l'ensemble de mes fichiers de configuration Spring était donc dans le répertoire /main/resources/spring/. L'application marchait très bien.

    Pour gérer des fichiers de configuration par environnement, j'ai suivi cet article qui propose de créer des profiles

    Dans mon répertoire resouces, je met tous les fichiers commun quels que soit l'environnement.
    Dans les répertoires resources_test et resources_dev, je met le fichier specific (Typiquement la connexion à la base)

    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
     
    <profiles>
        <profile>
          <id>dev</id>
          <activation>
            <activeByDefault>true</activeByDefault>
          </activation>
          <build>
            <resources>
              <resource>
                <directory>${basedir}/src/main/resources_dev</directory>
              </resource>
            </resources>
          </build>
        </profile>
        <profile>
          <id>test</id>
          <build>
            <resources>
              <resource>
                <directory>${basedir}/src/main/resources_test</directory>
              </resource>
            </resources>
          </build>
        </profile>
      </profiles>
    Le problème, c'est que je pense que je n'utilise pas la bonne instruction dans mon fichier web.xml.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    		classpath*:applicationContext*.xml
    		</param-value>
    	</context-param>
    Résultat, mon application ne prend que le fichier spécifique et pas les fichiers communs. Il n'arrive pas à charger les différents beans du context Spring (managers, dao, etc.)

    Avez-vous une idée?


    Dans le même genre, mes classes de test unitaire placé dans le répertoire test/java n'ont accès qu'au resource du répertoire test alors que je voudrais pouvoir utiliser les fichiers de configuration commun .


    D'avance merci pour vos réponses

  2. #2
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    J'ai résolu en partie mon problème en définissant 2 ressources:

    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
     
        <profile>
          <id>dev</id>
          <activation>
            <activeByDefault>true</activeByDefault>
          </activation>
          <build>
            <resources>
               <resource>
    	         <directory>${basedir}/src/main/resources</directory>
    	       </resource>
              <resource>
                <directory>${basedir}/src/main/resources_dev</directory>
              </resource>
            </resources>
          </build>
        </profile>
        <profile>
          <id>test</id>
          <build>
            <resources>
               <resource>
    	         <directory>${basedir}/src/main/resources</directory>
    	       </resource>
              <resource>
                <directory>${basedir}/src/main/resources_test</directory>
              </resource>
            </resources>
          </build>
        </profile>
    Mon problème venait aussi du fait que je ne faisais pas de "mvn clean" de mon projet avant de changer de profil.


    Par contre, pour mes tests unitaires situés dans le répertoire test/, je n'arrive toujours pas à trouver un moyen de spécifier que j'ai besoin des fichiers resources situé dans la partie, avez-vous des idées?

  3. #3
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Up!!

    Personne ne sait comment utiliser les mêmes fichiers de configuration Spring en test et en normal?

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut structure Maven classique
    src/main/java (packages des classes applicatives)
    src/main/resources (fichiers spring, pas dans un sous-répertoire)
    src/test/java (packages des classes de test)

    => inutile de préciser quoi que ce soit (resources ou autres) dans le pom.xml

  5. #5
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Avec cette structure de répertoire, les test unitaire échoue, car il ne trouve aucun fichier de configuration de context.


    Dans le web.xml

    Est-ce que mon instruction est la bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    		classpath*:applicationContext*.xml
    		</param-value>
    	</context-param>

  6. #6
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut configuration de spring
    Chez nous, le web.xml est configuré comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    			classpath:applicationContext-environment.xml
    			classpath:applicationContext-remoting.xml
    			classpath:applicationContext-scheduling.xml
    		</param-value>
    	</context-param>
    => pas d'étoile après "classpath" ; fichiers placés dans la racine d'un source folder.

  7. #7
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut oups ; quelle tête de linotte !
    Nos tests sont bien évidemment* configurés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={ "/applicationContext-environment.xml",
    				"/applicationContext-remoting.xml",
    				"/applicationContext-scheduling.xml" })
    public class BasicSpringTest extends AbstractJUnit4SpringContextTests {
    ...
    }
    Ne pas oublier l'import de Spring-test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-test</artifactId>
    		<version>2.5.6</version>
    		<type>jar</type>
    		<scope>test</scope>
    	</dependency>
    * pour la branche principale, le lancement de Spring est fait par le conteneur (cf. web.xml) ; pour les tests, il faut donc indiquer à jUnit qu'il y a de l'injection à faire. Il ne peut pas le "savoir", n'étant pas relié au conteneur.

  8. #8
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    J'ai fait différent test, et effectivement, en nommant explicitement chaque fichier de configuration, cela fonctionne, qu'ils soient placer dans main/resources ou dans un repertoire resources à la racine.

    Toutefois, comme j'ai une dizaine de fichier de configuration à charger :
    • conf
    • dwr
    • manager
    • dao
    • quartz
    • etc

    Ca fait beaucoup à mettre dans l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @ContextConfiguration(locations = { "/applicationContext-core-controller.xml", "/applicationContext-core-dao.xml", "/applicationContext-core-manager.xml", "/applicationContext-scheduler.xml",...})
    J'ai trouvé une solution intermédiaire:

    Du coup, dans mon pom.xml, j'ajoute dans les resources de test un lien vers celle du main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	<testResource>
    		<directory>${project.basedir}/src/main/resources</directory>
    	</testResource>
    Le classpath avec * semble fonctionner dans ce cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @ContextConfiguration("classpath*:applicationContext-*.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    Pour le moment, vue que je teste quasiment toute les couches, j'ai besoin de tout charger, peut que ça changera le jour ou je modulariserais, je reviendrais alors sur une declaration unitaire.

    Pour plus de clarté, j'hésite du coup à créer en plus de "main" et "test", une troisième arborescence "commom" contenant les resources communes à main et test.


    Par contre, j'ai remarque que pour chaque fichier de test, il charge systématiquement le context, n'y a t-il pas un moyen de le charger qu'une fois au début des tests?

  9. #9
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut import dans spring
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	<testResource>
    		<directory>${project.basedir}/src/main/resources</directory>
    	</testResource>
    => oui, cela revient à détourner Maven pour que les ressources des tests soient les mêmes que les ressources applicatives. Mais où mettre alors les fichiers d'entrée des tests, s'il y en a ?
    Peut-être qu'en mettant les fichiers applicationContext*.xml dans /src/main/java... mais c'est très vilain !

    Il est également possible de n'avoir qu'un seul applicationContext.xml dans lequel tous les autres sont importés une bonne fois pour toute (il y a une balise pour ça).
    Mais nous avons considéré qu'il serait plus efficace de préciser dans chaque série de tests lesquels sont réellement nécessaires. Une classe abstraite permet un import global pour tous les tests qui peuvent en hériter ; ça évite les retouches massives en cas d'évolution de la configuration de Spring.

  10. #10
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Je me lance seulement dans la création rigoureuse de test unitaire
    Pour le moment, j'appelle souvent le controlleur, qui appelle le manager, qui appelle le dao. Du coup, je dois quasiment tout charger à chaque fois.

    Mais a terme, je pense que mes tests seront plus ciblés, donc peut-être qu'à ce moment, je n'importerais que le fichier de configuration dao pour tester mes dao.

  11. #11
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut
    "j'ai remarque que pour chaque fichier de test, il charge systématiquement le context, n'y a t-il pas un moyen de le charger qu'une fois au début des tests?"
    => pas à ma connaissance ; peut-être du côté des TestSuites, mais j'en doute. A mon avis c'est pour préserver un espace "confiné" à chaque test. My 2 pens.
    http://today.java.net/pub/a/today/20...ml#test-suites

    Au boulot, maintenant !
    Bonne continuation. N'oubliez pas de marquer la discussion comme résolue.

  12. #12
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut qq subtilités
    FYI j'ai trouvé cette page qui indique qq astuces et précise le fonctionnement des annotations jUnit/Spring :
    http://gordondickens.com/wordpress/2...nt-know-about/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problèmes avec les différentes version de JVM & JDK
    Par Jcpan dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 02/01/2009, 18h01
  2. Problème tout bête (normallement :) ) avec les date/time
    Par KuBi4K dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 21/06/2007, 20h19
  3. [Cookies] problème d'en-tête avec les cookies
    Par weldata dans le forum Langage
    Réponses: 1
    Dernier message: 18/05/2007, 22h28
  4. [Avis aux pros !] Problèmes de la VCL avec les threads
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/02/2006, 22h38
  5. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20

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