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 :

Execution d'un client lourd appelant des EJB3.0 : NoInitialContextException


Sujet :

Wildfly/JBoss Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Execution d'un client lourd appelant des EJB3.0 : NoInitialContextException
    Bonjour,

    Depuis peu, j'ai décidé d'apprendre les EJB3.0 et d'utiliser JBOSS 5.0.1.GA.
    Je developpe sur mon ordinateur personnel ayant l'adresse IP suivante (192.168.0.10)
    les tests sont effectués sur celui-ci.

    1) Déploiement d'un EJB3.0

    Après avoir écris un EJB3.0 assez simple,
    j'ai démarré JBOSS dans sa configutaion par défaut :
    ./run.sh -b 192.168.0.10

    et puis je l'ai déployé sous :
    <JBOSS 5.0.1.GA.>/server/default/deploy

    La réponse du serveur et l'EJB semblent corrects.
    12:49:18,936 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

    ejb3/Hello/remote - EJB3.x Default Remote Business Interface
    HelloBean/remote-test.jboss.ejb3.hello.HelloRemote - EJB3.x Remote Business Interface
    ejb3/Hello/local - EJB3.x Default Local Business Interface
    HelloBean/local-test.jboss.ejb3.hello.HelloLocal - EJB3.x Local Business Interface

    2) Probleme : Appel de cet EJB depuis un client lourd

    Après j'ai écris un client lourd (très léger).

    package test.jboss.rich_client.hello;

    import java.util.*;
    import javax.ejb.EJB;
    import javax.naming.InitialContext;
    import javax.naming.Context;
    import javax.naming.NamingException;

    import test.jboss.ejb3.hello.HelloRemote;

    public class HelloRichClient{

    static private HelloRemote helloRemote = null;
    /**
    * @param args
    * @throws NamingException
    */
    public static void main(String[] args) throws NamingException {
    String result="";
    InitialContext ctx = new InitialContext();
    helloRemote = (HelloRemote)ctx.lookup("ejb3/Hello/remote");
    result=helloRemote.simpleHello( "Nicolas" ) ;
    System.out.println(" "+result);

    }

    }

    Avec un fichier jndi.properties comme suit :
    ### JBossNS properties
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.provider.url=jnp://192.168.0.10:1099
    java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

    Je le compile puis en fait un jar.

    A l'execution, j'obtiens l'erreur

    javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.<init>(InitialContext.java:175)
    at test.jboss.rich_client.hello.HelloRichClient.main(HelloRichClient.java:27)
    Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at java.lang.Class.forName0(Native Method)

    Ne sachant quels fichiers jar sont nécessaires pour compiler le client, j'avais mis dans
    le classpath tous les jar de JBOSS (lib et client ).

    Je ne parviens pas pour l'instant à déterminer d'ou vient l'erreur puisque je dispose bien
    d'un jndi.properties.

    Merci d'avance car au début, l'apprentissage des EJB3.0 n'est pas si aisé ( avec tous les fichiers jars disponibles).

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    J'avais fait un dev et voilà les lib dont j'avais besoin.
    Essaie de voir dans laquelle se trouve la classe NamingContextFactory.

    jboss-j2ee
    jbossall-client
    jboss-ejb3x

    Tu en as besoin pour la compilation mais aussi pour l'exécution de ton main.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    En utilisant la version 5.0.1.GA, je ne dispose pas de certains de ces jars.
    Néanmoins, juste en utilisant jbossall-client.jar, la plupart de la compilation se passe bien,
    mais j'ai le message suivant si dans le classpath, je ne rajoute pas mon hello_ejb3.jar qui contient l'interface et l'implementation de l'EJB déployé

    1) Compilation avec erreur

    javac -cp .:/opt/jboss/jboss-5.0.1.GA/client/jbossall-client.jar test/jboss/rich_client/hello/HelloRichClient.java

    test/jboss/rich_client/hello/HelloRichClient.java:9: package test.jboss.ejb3.hello does not exist
    import test.jboss.ejb3.hello.HelloRemote;
    ^
    test/jboss/rich_client/hello/HelloRichClient.java:13: cannot find symbol
    symbol : class HelloRemote
    location: class test.jboss.rich_client.hello.HelloRichClient
    static private HelloRemote helloRemote = null;
    ^
    test/jboss/rich_client/hello/HelloRichClient.java:28: cannot find symbol
    symbol : class HelloRemote
    location: class test.jboss.rich_client.hello.HelloRichClient
    helloRemote = (HelloRemote)ctx.lookup("ejb3/Hello/remote");
    ^
    3 errors

    2) Compilation sans erreur

    javac -cp .:/opt/jboss/jboss-5.0.1.GA/client/jbossall-client.jar:../hello_ejb3.jar test/jboss/rich_client/hello/HelloRichClient.java

    3) Questions

    Pour compiler, est-il toujours nécessaire de mettre l'interface et l'implementation de l'EJB ou l'interface uniquement suffit-elle ?

    4) Probleme quasi resolu

    Merci, en réalisant le classpath du 2), dorénavant l'application fonctionne.
    Le problème ne venait donc que de mes classpath et pas de mon jndi.properties comme je le pensais.
    Maintenant, j'ai juste le message d'avertissement suivant :

    log4j:WARN No appenders could be found for logger (org.jnp.interfaces.TimedSocketFactory).
    log4j:WARN Please initialize the log4j system properly.

    Hello Nicolas !

    Comment faire pour faire disparaitre ce message ? Faut-il utiliser un Logger dans mon application ou autre ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    J'utilisais JBoss 4 ce qui explique peut-être la différence de jars.
    Oui, ton client a besoin des interfaces de l'EJB mais pas de l'implémentation.

    Je pense qu'il te suffit de bien paramétrer ton logger pour faire disparaître le message.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Voici, rapidement un complément d'information.

    Pour compiler le client, je disais précédemment :

    2) Compilation sans erreur

    javac -cp .:/opt/jboss/jboss-5.0.1.GA/client/jbossall-client.jar:../hello_ejb3.jar test/jboss/rich_client/hello/HelloRichClient.java

    En effet dans ce cas là il n'y avait pas d'erreur.
    Mais si maintenant, on copier dans le répertoire courant de travail jbossall-client.jar.
    La commande suivante ne fonctionne plus.
    javac -cp .:jbossall-client.jar:../hello_ejb3.jar test/jboss/rich_client/hello/HelloRichClient.java

    Ceci est du au fait que le jar jbossall-client.jar ne contient qu'un MANIFEST qui mets dans le classpath un tas d'autres fichiers jar.
    En conséquence, si on veut compiler sans aucun problème les fichiers dans le répertoire de travail courant, il faut aussi copier toutes les dépendances.

    Enfin, j'ai également essayé de compiler mon client qu'avec les interfaces, et cela fonctionne très bien.
    Merci pour les réponses précédentes.
    Tout fonctionne bien !

    N.B :
    Les tutoriels sur Log4j m'ont également permit de faire disparaître les messages d'erreurs.
    http://beuss.developpez.com/tutoriel...jakarta/log4j/

Discussions similaires

  1. Interaction entre un client lourd JAVA et des pages PHP
    Par Schyzophrenic dans le forum Général Java
    Réponses: 10
    Dernier message: 18/06/2009, 18h31
  2. appeler des scripts executables
    Par Mydriaze dans le forum Général Python
    Réponses: 7
    Dernier message: 27/03/2009, 16h36
  3. extraction des clients date appel > 12 jours
    Par bouba_95 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2007, 15h13
  4. Réponses: 1
    Dernier message: 28/02/2007, 17h33
  5. Réponses: 1
    Dernier message: 24/10/2006, 00h24

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