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

Wildfly/JBoss Java Discussion :

Problème de classpath et de fichier de configuration Spring


Sujet :

Wildfly/JBoss Java

  1. #1
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut Problème de classpath et de fichier de configuration Spring
    Je vous explique mon problème: je déploie une application sur un serveur JBoss 4.2.2 sous forme d'un EAR.
    Dans cet EAR, il y a:
    • un JAR avec les interfaces de mes services Spring (myapp-common.jar)
    • un JAR avec les implémentations de mes services Spring et les fichiers de configurations dont applicationContext.xml à la racine (myapp-core.jar)
    • un WAR avec un webservice Spring-WS qui va appeler mes services Spring (myapp-ws.war)


    Dans le war du webservice, j'ai le fichier web.xml suivant:
    Code xml : 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
     
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
             version="2.4">
     
        <display-name>My App</display-name>
     
        <servlet>
            <servlet-name>spring-ws</servlet-name>
            <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        </servlet>
     
        <servlet-mapping>
            <servlet-name>spring-ws</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
     
        <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
     
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath:applicationContext.xml
                classpath:applicationContext-dataSource.xml
                classpath:applicationContext-mail.xml
            </param-value>
        </context-param>
     
    </web-app>

    Et donc les trois applicationContext-*.xml sont à la racine de myapp-core.jar

    Maintenant quand je démarre le serveur et qu'il charge l'application, il me dit qu'il ne trouve pas applicationContext.xml, comme s'il n'était pas sur le classpath.

    Quelqu'un a une idée d'où ça peut merder dans ma config?
    Sébastien ARBOGAST
    SCJP

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.
    Normalement, applicationContext.xml de Spring et dans le cadre d'une application web doit aller dans le dossier WEB-INF ... pas dans la racine de l'application.

    Bonne chance.

  3. #3
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Oui mais là il est pas dans la racine de l'application war, mais dans la racine d'une archive JAR qui est dans le même EAR que le WAR. Et je ne peux pas trop le déplacer, parce que mon objectif à terme c'est d'avoir plusieur WAR dans l'EAR qui dépendent du même JAR avec une seule version centralisée de l'applicationContext.xml.
    Sébastien ARBOGAST
    SCJP

  4. #4
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Oki !
    Tu peux donc ajouter ceci dans ton web.xml:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/applicationContext.xml</param-value>
    </context-param>

    Histoire de dire au ContextLoaderListener de Spring de pas cherche applicationContext.xml dans web-inf mais à la racine.

    Tiens nous au courant.

  5. #5
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Euh, petit correctif:
    La solution donnée dans le post précédent marche pour un fichier local à la racine de l'application, mais dans ton cas (fichier dans un jar), tu dois plutôt faire:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    J'ai testé et cela marche.

    Bonne chance.

  6. #6
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Alors justement c'est avec ça que j'avais commencé mais ça ne fonctionnait pas.
    Par contre avec un mix des deux solutions ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:/applicationContext.xml</param-value>
    </context-param>
    Sébastien ARBOGAST
    SCJP

  7. #7
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Dans le test que j'ai fait, j'ai mis applicationContext.xml dans la racine d'un jar que j'ai inclus dans le classpath de l'application web, et ça marchait ...
    Mais bon, dans un ear, peut être que ça marche autrement.
    Alors, on n'aurait pas oublié pas le ?

  8. #8
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Oui effectivement quand je mets la librairie core dans le WEB-INF du WAR, ça marche. Mais pas quand je la mets à côté du WAR.

    Enfin tu as raison, résolu!
    Sébastien ARBOGAST
    SCJP

  9. #9
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    En fait, ça ne marche pas du tout. Je ne sais pas comment je me suis débrouillé pour faire sauter l'exception mais comme j'en avais une autre à la place, j'ai supposé que celle-là avait sauté. Mais non. Donc je cherche toujours un moyen (si toutefois c'est possible) d'accéder à ce fichier de configuration qui se trouve dans un autre JAR dans le même EAR que mon WAR.
    Sébastien ARBOGAST
    SCJP

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Je développe pour l'instant une projet dans un .EAR ... J'ai un peu comme toi, un .war qui réclame des .class (mais ceux-ci ne se trouve pas sous WEB-INF)...

    En fait, dans eclipse, tu peux lié le projet WEB (.war) et le .jar d'un autre projet (je sais pas ce qu'il fait exactement, mais ca doit etre une histoire de classpath). Cette solution, je l'ai abandonné au profit d'un autre projet (de base, qui est en fait le .ear) et lui, inclu tous les .jar ou .war (qui sont donc sur le meme niveau).

    Je vais un peu regarder le .ear qu'il a généré...

    Déjà, il n'y a pas besoin de modifier le fichier application.xml pour y ajouter le .jar (quoi que, il y a normalement une directive pour prendre en compte un répertoire de lib partagée pour toute l'application ... qui serait un répertoire dans l'archive .ear).

    Bon voilà, j'ai fini de regarder .. Visiblement, il n'y a rien de particulier à configurer pour le .jar étant introuvable. Ni pour le .ear, ni pour le .war donc en principe, si tu place directement ton .jar dans le .ear, c'est JBoss qui va s'en charger et faire comme tout bon .jar: en tenir compte

    Peut être que tu as une ... autre implémentation ailleur ... mais je pense pas ... Exemple: si une version de ton .jar est disponible dans un répertoire de lib de JBoss ainsi que dans ton .ear, ben il va utiliser la version disponible dans JBoss et pas celle de ton .ear ... Ce que tu peux faire pour remédier à cela (pour tester du moins), c'est de placer directement ton .jar dans lib/ext du rep JRE de ton JDK (si je me trompe pas) ainsi, ce sera une lib qui sera trouvée avant tout autre ... Je pense pas que ca changera quelque chose pour toi vu que c'est ton implémentation et qu'elle n'est surement pas fournie par défaut dans JBoss...

  11. #11
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Je crois que j'ai finalement trouvé ce qui n'allait pas. Si je veux que mon JAR soit accessible par mon WAR, j'ai deux possibilités:
    - Soit je le mets dans le dossier WEB-INF/lib du WAR lui-même
    - Soit je le mets dans la racine de l'EAR mais alors je dois le référencer aussi dans META-INF/application.xml

    Comme je gère mes dépendances avec Maven et que je n'ai pas envie de spécifier deux fois mes dépendances (une fois dans le POM et une fois dans application.xml), je me suis tourné vers la première solution, même si ça fait exploser la taille de mon EAR.

    Et en mettant tout dans le WEB-INF/lib de mon WAR, tout fonctionne. Par contre un enseignement important que j'ai retiré de ces quelques jours de galère: il faut éviter à tout prix d'avoir des librairies en double dans le WEB-INF/lib et dans la racine de l'EAR, parce que même si les versions sont identiques, on se chope des ClassCastException et des ClassNotFoundException à tout va juste parce que les classes sont parfois chargées dans deux classloaders différents (celui du WAR et celui de l'EAR). Bilan des courses, je n'ai laissé que mes WAR à la racine de mon EAR, et tous les JAR sont dans les WEB-INF/lib.
    Sébastien ARBOGAST
    SCJP

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    J'ai eu ce problème à un moment, mais de mon coté, j'ai besoin de la lib pour le module du bean et le module web .. donc je peux pas placer la lib uniquement dans le module web, c'est pourquoi je l'ai mis à la base de l'archive ear ... et je n'ai rien dans le manifest ou l'application.xml qui pointe vers la lib ou vers le repertoire qui pourrait contenir la lib ... Je suppose qu'il sais, par défaut, que tout jar à la racine de l'ear est une lib ...

  13. #13
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Moi aussi ça marchait comme ça tant que je recopiais mes fichiers de configuration Spring dans WEB-INF/lib, il arrivait à retrouver indirectement les classes à la racine de mon JAR. Enfin ça reste pas très clair tout ça. J'ai cherché de la doc qui expliquerait un peu comment fonctionne le classloader de JBoss dans un EAR, mais je n'ai rien trouvé. A bon entendeur...
    Sébastien ARBOGAST
    SCJP

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    http://images.google.be/images?gbv=2...che+d%27images


    Tu recherche dans google des images avec le texte "classloader jboss"

    et dans les sites web, tu tombes sur des guides ou autres contenant des ptit schéma et explication la dessus

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/06/2013, 10h23
  2. Problème pour les fichiers de configuration
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 15
    Dernier message: 29/01/2009, 09h35
  3. Problème avec fichier de configurations
    Par ploxien dans le forum Maven
    Réponses: 2
    Dernier message: 02/10/2008, 16h12
  4. Recupérer le fichier de configuration spring
    Par Space23 dans le forum Spring Web
    Réponses: 1
    Dernier message: 14/07/2008, 19h11
  5. problème d'accès à un fichier de configuration XML
    Par yeddoughmi dans le forum Autres
    Réponses: 1
    Dernier message: 30/05/2007, 20h53

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