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

Java EE Discussion :

Problème de classloader wilfly


Sujet :

Java EE

  1. #1
    Expert éminent
    Problème de classloader wilfly
    J'ai trois projets

    demo-jca-api qui défini les interfaces
    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    com.sample.adapter.HelloWorldConnectionFactory
    com.sample.adapter.HelloWorldConnection


    demo-jca qui implemente une resource JCA sur cette API
    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package com.sample.adapter.impl;
    import com.sample.adapter.HelloWorldConnectionFactory;
     
    public class HelloWorldConnectionFactoryImpl implements HelloWorldConnectionFactory
    {...


    enfin j'ai un war qui utilise cette ressource
    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
          @Resource(name="java:/eis/HelloWorld")
          HelloWorldConnectionFactory helloFactory;  
          HelloWorldConnection hello = helloFactory.getConnection();
          return hello.helloWorld();


    La ressource se déploie correctement sous Wildfly (debug pas à pas avec éclipse tout est ok)
    le war démarre correctement.

    lorsque j'appelle la méthode avec la code ci-dessus
    j'ai l'exception suivante
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Caused by: java.lang.ClassCastException: Cannot cast com.sample.adapter.impl.HelloWorldConnectionFactoryImpl to com.sample.adapter.HelloWorldConnectionFactory



    J'ai changé mon code pour le faire à l’ancienne et voir ce qu'il se passait exactement.
    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          Context context = new InitialContext();
          Object object = context.lookup("java:/eis/HelloWorld");
          Class<?> interf = object.getClass().getInterfaces()[0];
          if (HelloWorldConnectionFactory.class.isAssignableFrom(object.getClass())) {
             System.err.println("test");
          }
          HelloWorldConnectionFactory helloFactory = HelloWorldConnectionFactory.class.cast(object);  
          HelloWorldConnection hello = helloFactory.getConnection();
          return hello.helloWorld();


    en mode débug cela m'a permis de voir que HelloWorldConnectionFactory.class et interf sont toutes les deux com.sample.adapter.HelloWorldConnectionFactory, mais n'ont pas le même id
    et ne référence pas le même classloader.

    Cela parait logique puisque interf est chargé par le module rar alors que HelloWorldConnectionFactory est chargé par le war.

    mais du coup je ne trouve pas comment faire.

    tout cela n'est pas dans un EAR. mon besoin est de partager le RAR entre plusieurs applications.

    A+JYT

  2. #2
    Membre actif
    Ton interface se retrouve dans les 2 modules (rar et war) donc tu as 2 classloaders. Il ne faut pas inclure les classes du rar dans ton war. Il sera peut être nécessaire d'ajouter une dépendance vers le rar via un jboss-deployment-structure.xml (cf. http://www.mastertheboss.com/jboss-s...-structure-xml)

  3. #3
    Expert éminent
    merci

    si j'ai bien compris

    je dois créer un fichier jboss-deployment-structure.xml dans mon rar
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <jboss-deployment-structure>
      <deployment>
          <dependencies>
             <module name="demo-jca-api-1.0.0-SNAPSHOT.jar" export="TRUE"/>
          </dependencies>
        </deployment>
    </jboss-deployment-structure>


    je dois créer un fichier jboss-deployment-structure.xml dans mon war
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <jboss-deployment-structure>
      <deployment>
          <dependencies>
             <module name="demo-jca-api-1.0.0-SNAPSHOT.jar"/>
          </dependencies>
        </deployment>
    </jboss-deployment-structure>


    Ainsi mon war va importer les définition du rar.

    je vais tester ça demain

    A+JYT

  4. #4
    Modérateur

    Personnellement, pour la partie commune, je passerais par un module défini au niveau du répertoire modules de Wildfly.
    Tant qu'à faire, créer un nouveau répertoire "specifique" (au même niveau que system) et suivre la logique de définition (avec un sous répertoire main qui contiendra le jar et le fichier module.xml pour les dépendances et les options d'export).

    Ensuite, dans les projets utilisateurs, il n'y a plus qu'à ajouter l'attribut Dependencies dans le fichier Manifest.mf, comme par exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Manifest-Version: 1.0 
    Dependencies: specifique.shared

    Pour cet exemple, nous aurions l'arborescence suivante
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    modules
           specifique
                 shared  
                      main
                            le-fichier.jar
                            module.xml

    le fichier module.xml
    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?> 
     
    <module name="specifique.shared" xmlns="urn:jboss:module:1.5"> 
     
        <resources> 
            <resource-root path="le-fichier.jar"/> 
        </resources> 
        <dependencies> 
            <module name="javax.api"/> (par exemple)
        </dependencies> 
    </module>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    en passant par un module cela n'est plus compatible avrc d'autres serveurs jee.

    je souhaite que mon rar soit utilisable dans d'autres plateformes que wilfly.

  6. #6
    Expert éminent
    Citation Envoyé par sekaijin Voir le message
    merci

    si j'ai bien compris

    je dois créer un fichier jboss-deployment-structure.xml dans mon rar
    ...
    je vais tester ça demain

    A+JYT
    Bon je viens de tester et cela ne fonctionne pas
    j'ai mis
    un fichier jboss-deployment-structure.xml dans mon rar
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <jboss-deployment-structure>
      <deployment>
          <dependencies>
             <module name="demo-jca-api-1.0.0-SNAPSHOT.jar" export="TRUE"/>
          </dependencies>
        </deployment>
    </jboss-deployment-structure>


    un fichier jboss-deployment-structure.xml dans mon war
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <jboss-deployment-structure>
      <deployment>
          <dependencies>
             <module name="demo-jca-api-1.0.0-SNAPSHOT.jar"/>
          </dependencies>
        </deployment>
    </jboss-deployment-structure>


    J'avais la même erreur due à deux fois la classe par deux classloaders.
    Du coup l'ai exclus demo-jca-api-1.0.0-SNAPSHOT.jar du war
    mais cette fois j'ai
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Caused by: java.lang.ClassNotFoundException: com.sample.adapter.HelloWorldConnectionFactory from [Module "deployment.work-manager-client.war" from Service Module Loader]


    Ne sachant pas très bien quoi mettre dans la dependencies j'ai aussi essayé avec le rar plutôt que le jar
    mais ça ne change rien.

    JCA est une norme n'y a-t-il pas une doc qui explique comment s'y prendre ?
    J'ai par le passé utilisé des rar pour se connecter à SAP ou à ActiveMQ sur d'autres plateforme et il n'y a avait pas descripteur propre à la plateforme
    J'installais mon rar sous WebSphère la console me permettais de configurer la connexion
    et je n'avais rien d'autre à faire pour l'utiliser que de dépendre de l'API

    Je ne comprends pas comment fonctionne Wilfly sur ce point.

    A+JYT

  7. #7
    Membre actif
    Regarde ce tutorial: http://www.mastertheboss.com/jboss-f...ector-tutorial
    Je pense que tu n'es pas loin d'y parvenir.

  8. #8
    Expert éminent
    C'est justement de celui-la que je suis partit
    mais ça ne fonctionne pas

  9. #9
    Expert éminent
    Bonjour

    Je n'ai toujours pas trouvé de solution.

    wildfly serait-il un serveur JEE qui n'implémente pas tout JEE ?

    Je ne trouve aucune solution.
    Tout cela me parait bien étrange.

    A+JYT

  10. #10
    Membre actif
    Wildfly est certifiée Java EE 8
    Mets ton code en ligne qu'on puisse y jeter un oeil.

  11. #11
    Expert éminent
    bonjour

    je mets le zip en copie


    merci
    A+JYT