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

avec Java Discussion :

ClassNotFound alors qu'elle y est bien !


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut ClassNotFound alors qu'elle y est bien !
    bonjour,

    J'ai plutot l'habitude de développer des plugins sous Eclipse, et executer du java pur j'ai jamais trop fait ... et là je sèche sur un truc qui a l'air tout bête ... Pour info, je teste des échanges entre un serveur et un client RMI.
    J'ai 3 classes sous un repertoire X :
    Server.java (implements Hello)
    Client.java
    Hello.java (extends Remote)

    je compile sous X (javac -d bin Hello.java Server.java Client.java) dans un répertoire bin donc j'ai :
    X/bin/example/hello/Server.class
    X/bin/example/hello/Hello.class
    X/bin/example/hello/Client.class

    Je lance mon rmiregister (start rmiregistry)
    J'exécute sous X (start java -classpath bin example.hello.Server) et là c'est le drame :
    java.lang.ClassNotFoundException: example.hello.Hello

    Et vraiment je ne comprends pas ...
    J'ai vérifié les noms des classes .. je donne bien le classpath et le nom du package ...

    Une idée ?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    donne le log complet de ta console lors de l'exception. L'exception toute seule n'est pas parlante. Le contenu de ton Hello.java serait aussi bien utile.

  3. #3
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    Bonjour,

    Voici ma sortie console :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Server exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
            java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
            java.lang.ClassNotFoundException: example.hello.Hello
    		java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
            java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
            java.lang.ClassNotFoundException: example.hello.Hello
            at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:420)
            at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
            at sun.rmi.transport.Transport$1.run(Transport.java:200)
            at sun.rmi.transport.Transport$1.run(Transport.java:197)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
            at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(TCPTransport.java:683)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:745)
            at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
            at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
            at sun.rmi.server.UnicastRef.invoke(Unknown Source)
            at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
            at example.hello.Server.main(Server.java:61)
    Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
    ception is:
            java.lang.ClassNotFoundException: example.hello.Hello
            at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
            at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410)
            at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
            at sun.rmi.transport.Transport$1.run(Transport.java:200)
            at sun.rmi.transport.Transport$1.run(Transport.java:197)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
            at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(TCPTransport.java:683)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.ClassNotFoundException: example.hello.Hello
            at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
            at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1207)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:348)
            at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221)
            at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:731)
            at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:674)
            at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:611)
            at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
            at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
            at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:255)
            at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1559)
            at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
            at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
            at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
            at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
            ... 15 more
    et mon Hello.java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package example.hello;
     
    import java.rmi.Remote;
    import java.rmi.RemoteException;
     
    public interface Hello extends Remote {
        String sayHello() throws RemoteException;
    }
    voilà !

  4. #4
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    Bonjour,
    moi, je rencontre "ClassNotFoundException" souvent, mais avant que ça n'apparaisse j'ai d'abord un message du genre "mémoire virtuelle insuffisante", alors à chaque fois que j'exécute mon programme après ce message cette exception est levée! Pour régler ça, je redémarre mon pc, je fais une copie de ma classe 'NotFound', je supprime l'originale, puis je renomme la copie avec le nom de l'originale.
    j'avoue que c bête comme méthode mais ça marche à chaque fois!
    sinon pour éviter tout ça, à chaque fois que j'ai le message de mémoire virtuelle insuffisante, je n'exécute plus rien,je redémarre ma machine directe, j'évite ainsi l'exception.
    bon courage!

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    on peux voir ton main? A vue de l'exception, ton main fait un bind sur le RMIRegistry, en lui passant un Objet dans un ObjectOutputStream, ce qui fait que le rmiregistry est incapable de lire l'objetInputStream de son coté, car le RMIRegistry, lui, il ne connait pas la classe Hello.
    Ce qui n'est pas, c'est que ton serveur seretrouve sérialisé lors du bind, ca voudrais dire que ton objet Server n'est pas un objet RMI à l'écoute. Les paramètre en RMI peuvent être passé de deux manière: comme RemoteObject si ils restent dans leur JVM de départ, accessibles à distance. Ou par copie via Serialization, si ce sont juste des données.

  6. #6
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    J'ai copié cet exemple qui ne fait pour le moment pas grand chose mais je voulais juste tester que ça fonctionnait bien avant d'y ajouter mes propres fonctionnalités.
    Mais déjà juste ça, je ne suis pas allé très loin ...

    Voici mon client :
    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
     
    package example.hello;
     
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
     
    public class Client {
     
        private Client() {}
     
        public static void main(String[] args) {
     
    	String host = (args.length < 1) ? null : args[0];
    	try {
    	    Registry registry = LocateRegistry.getRegistry();
    	    Hello stub = (Hello) registry.lookup("Hello");
    	    String response = stub.sayHello();
    	    System.out.println("response: " + response);
    	} catch (Exception e) {
    	    System.err.println("Client exception: " + e.toString());
    	    e.printStackTrace();
    	}
        }
    }
    Voici mon serveur:
    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
     
    package example.hello;
     
    import java.rmi.registry.Registry;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
     
    public class Server implements Hello {
     
        public Server() {}
     
        public String sayHello() {
    	return "Hello, world!";
        }
     
        public static void main(String args[]) {
     
    	try {
    	    Server obj = new Server();
    	    Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
     
    	    // Bind the remote object's stub in the registry
    	    Registry registry = LocateRegistry.getRegistry();
    	    registry.bind("Hello", stub);
     
    	    System.err.println("Server ready");
    	} catch (Exception e) {
    	    System.err.println("Server exception: " + e.toString());
    	    e.printStackTrace();
    	}
        }
    }
    Voici mon hello:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package example.hello;
     
    import java.rmi.Remote;
    import java.rmi.RemoteException;
     
    public interface Hello extends Remote {
        String sayHello() throws RemoteException;
    }

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je viens de checker, ça s'est pas amélioré avec les années le RMI

    Bon, je registry a besoin du classpath des interfaces, sinon il peut pas les binder. Le solution sont, au choix:

    se mettre dans le dossier bin de ton serveur pour lancer rmiregistry
    lancer rmiregistry avec le paramètre -J-classpath=.....
    lancer rmiregistry depuis ton serveur directement avec LocateRegistry.createRegistry();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                // Bind the remote object's stub in the registry
                Registry registry = LocateRegistry.createRegistry(1099);
                registry.bind("Hello", stub);

  8. #8
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    YES !
    Merci ça marche !!!!


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

Discussions similaires

  1. Réponses: 22
    Dernier message: 29/04/2011, 15h23
  2. Réponses: 0
    Dernier message: 28/07/2010, 16h52
  3. Réponses: 2
    Dernier message: 03/07/2007, 08h47
  4. Réponses: 7
    Dernier message: 30/12/2006, 17h13
  5. Fonction non définie (alors qu'elle l'est) - Cocher toutes les cases
    Par navis84 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/09/2006, 12h02

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