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

API standards et tierces Java Discussion :

[RMI] java.rmi.UnmarshalException


Sujet :

API standards et tierces Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut [RMI] java.rmi.UnmarshalException
    Bonjour,

    Depuis un JAR, j'accède à une classe distante (d'un projet web) via les RMI. Je fais mes tests en Local depuis mon RSA. (ou eclipse)
    Sur mon projet java (donc mon jar) j'ai fais une réréfence à mon projet web pour que la compilation fonctionne. A l'éxécution pas de soucis le RMI a fonctionné avec succès.

    En revanche, en retirant la référence au projet WEB je me trouve logiquement avec des erreurs de compilation. J'inclus donc les jar contenant les classes nécessaires. La compilation est un succès mais à l'éxécution j'ai l'erreur suivante :

    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
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    	java.lang.ClassNotFoundException: com.acticall.fnmf.core.DispatchMakerRemoteImpl_Stub (no security manager: RMI class loader disabled)
    	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    	at com.acticall.fnmf.batchAcp.work.impl.NoInterviewSince30DaysTreatment.doTreatment(NoInterviewSince30DaysTreatment.java:103)
    	at com.acticall.fnmf.batchAcp.work.BatchAcpMain.doTreatments(BatchAcpMain.java:79)
    	at com.acticall.fnmf.batchAcp.work.BatchAcpMain.main(BatchAcpMain.java:33)
    Caused by: java.lang.ClassNotFoundException: com.acticall.fnmf.core.DispatchMakerRemoteImpl_Stub (no security manager: RMI class loader disabled)
    	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:371)
    	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    	at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
    	at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
    	at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
    	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
    	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
    	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
    	... 4 more


    Quelqu'un aurait il une bonne idée ?
    Thanks

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Ah oui j'ai oublié, ma classe DispatchMakerRemoteImpl_Stub existe bien sur le serveur ...

  3. #3
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    une rapide recherche m'a permit de trouver ceci : [RMI] rmic et packages

    Je n'ai pas tout lu mais le problème ressemble beaucoup au tien et a la fin le problème est résuolu
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Merci de ta réponse ... cependant je ne suis pas sur de bien comprendre la conclusion du problème.

    Si je comprends bien il s'agirait de mettre le package des classes client sur le serveur ? Ou j'ai rien compris .... ?!

  5. #5
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    non je ne pense pas que tu ai a faire cela (et d'ailleur la fin ils ont le client et le serveur dans deux packages différents). En plus mettre tout dans le meme package, ca me gène pas mal d'un point de vue conceptuel (mais c'est encore un autre débat)

    Apparement ce qui gène serait plutot du coté du sécurityManager (code tiré du lien donné plus haut)
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (System.getSecurityManager() == null)
    System.setSecurityManager(new RMISecurityManager());

    Sinon, il se peut également que les stub ne soit pas correctement généré ou pas présent coté client.

    Autre conseil au passage : si c'est la première fois que tu fais du RMI, je te conseil de trouver un exemple simple (ou un tutoriel) qui te permetterai de comprendre comment ca marche.
    De souvenir, la communication RMI n'est pas toujours très simple a mettre en oeuvre et tu n'es pas au bout de tes surprises.

    Encore un conseil : arme toi de patience et bon courage. Si tu as besoin d'aide je pense que le mieu c'est de parler autour d'un exemple plus concret (Si tu as un bout de code qui tourne sous la main n'hésite pas a le faire partager pour qu'on essaye et qu'on voit ce qui ne va pas)
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    // Code client

    // J'ai ici besoin des beans stockés sur mon appli distante. J'ai donc packagé les bean distants dans un JAR
    import com.monProjet.bean.references;
    import com.monProjet.bean;

    try {
    //Récupération des propriétés du RMI

    int remotePort = 1095;
    String remoteIp = "localhost"; // ou IP si distant
    String remoteObjectName = "remoteDispatchMaker";

    //System.setSecurityManager(new java.rmi.RMISecurityManager());

    Registry registry = LocateRegistry.getRegistry(remoteIp, remotePort);
    DispatchMakerRemote dispatchMakerRemote = (DispatchMakerRemote) registry.lookup(remoteObjectName);

    if(dispatchMakerRemote != null
    && dispatchMakerRemote.maMethodeDistante(monObjetSerialise)){
    logger.debug("RMI Appel classe distante : SUCCESS");
    } else {
    logger.debug("RMI Appel classe distante : FAILED");
    }
    }
    catch (Exception e) {
    e.printStackTrace();


    Et la c'est le drame ....
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.lang.ClassNotFoundException: com.monProjet.core.DispatchMakerRemoteImpl_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at com.monProjet.batchAcp.work.impl.NoInterviewSince30DaysTreatment.doTreatment(NoInterviewSince30DaysTreatment.java:103)
    at com.monProjet.batchAcp.work.BatchAcpMain.doTreatments(BatchAcpMain.java:79)
    at com.monProjet.batchAcp.work.BatchAcpMain.main(BatchAcpMain.java:33)
    Caused by: java.lang.ClassNotFoundException: com.monProjet.core.DispatchMakerRemoteImpl_Stub (no security manager: RMI class loader disabled)

    }


    Et sur le serveur :

    // Dans la classe d'initialisation

    try{
    Registry reg = java.rmi.registry.LocateRegistry.createRegistry(1095);
    DispatchMakerRemoteImpl dmri = new DispatchMakerRemoteImpl();
    // System.setSecurityManager(new java.rmi.RMISecurityManager());

    reg.bind("remoteDispatchMaker", dmri);
    }
    catch (Exception e) {
    e.printStackTrace();
    }



    // La classe DispatchMakerRemoteImpl

    package com.monProjet.core;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;

    import com.monProjet.bean.monObjetSerialise;
    import com.monProjet.common.process.DispatchMaker;


    public class DispatchMakerRemoteImpl extends UnicastRemoteObject implements DispatchMakerRemote{
    private static final long serialVersionUID = -5891965407653576892L;

    public DispatchMakerRemoteImpl() throws RemoteException {
    super();
    }

    public boolean maMethodeDistante(monObjetSerialise obj) throws RemoteException {
    try {
    System.out.println(obj.display();
    return true;
    } catch (Exception e) {
    e.printStackTrace();
    return false;
    }
    }
    }


    // L'interface DispatchMakerRemote

    package com.monProjet.core;
    import java.rmi.RemoteException;

    import com.monProjet.bean.monObjetSerialise;

    public interface DispatchMakerRemote extends java.rmi.Remote {
    public boolean maMethodeDistante(monObjetSerialise obj) throws RemoteException;
    }



    Pour générer la souche (donc le stub) :
    C:\Sun\AppServer\jdk\bin>rmic -classpath D:\Workspace\monProjet\WebContent\WEB-INF\classes com.monProjet.core.DispatchMakerRemoteImpl


    Voila, je pense avoir mis l'essentiel ... si quelqu'un peut m'éclairer sur mon problème !

    Le System.setSecurityManager ne change rien ;-)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    J'ai identifié une partie du problème mais je ne parviens pas à le résoudre.

    Le problème intervient quand j'intègre les beans au classpath du client. Du coup mes beans sont à la fois sur le client et sur le serveur.

    C'est peut peut-être çà le problème ... mais si c'est bien çà, je ne vois pas comment le résoudre !!

  8. #8
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Coté client, tu ne dois manipuler que l'interface, dans ton jar, tu ne devrais pas avoir l'implémentation de tes beans. Peut être que ca te fera avancer.

    Edit: j'ai l'impression de dire plein de connerie. Pour ma peine, j'essay ton exemple et je me replonge dans le monde merveilleu de RMI

    PS: peux tu éditer ton message avec ton code et utiliser la balise [code ] ... [/code ]
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Je suis d'accord avec toi mais si je n'inclus pas mes beans du coté client çà risque de ne pas compiler ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DispatchMakerRemote dispatchMakerRemote = (DispatchMakerRemote) registry.lookup(remoteObjectName);
    								
    if(dispatchMakerRemote != null && dispatchMakerRemote.sendLetter(MONBEAN){
        logger.debug("RMI Appel distant DispatchMaker : SUCCESS");
    } else {
        logger.debug("RMI Appel distant DispatchMaker : FAILED");
    }
    Ici coté client, le paramètre que je vais passer à ma méthode distante est un bean commun aux deux applications d'où mon intérêt pour l'utilisation d'un jar Beans.

    En fait c'est vraiment au niveau du classpath que j'ai un problème :

    EXEMPLE :

    Si j'ajoute mon projet web au classpath de mon JAR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <classpathentry combineaccessrules="false" kind="src" path="/monprojetweb"/>
    alors j'ai aucun soucis

    En revanche si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <classpathentry kind="lib" path="resource/lib/monProjet-beans.jar"/>
    <classpathentry kind="lib" path="resource/lib/monProjet-ref-beans.jar"/>
    Ca ne marche pas ...

  10. #10
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Je viens de tester ton exemple (en modifiant très légèrement) avec succés

    J'ai joint les projet eclipse correspondant (j'ai cru comprendre que tu utilisais eclipse egalement donc ca ne posera pas de pb).

    Ce qui m'étonne c'est que je n'ai pas eut a faire de rmic... j'ai cru lire sur un autre forum que depuis java 5 les stub était généré dynamiquement.
    Fichiers attachés Fichiers attachés
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Oui en liant les deux projets ca fonctionne. Mais si tu ne les lies pas, chez moi en tout cas çà ne marche pas.

    Par contre je suis en java 1.4 et j'ai bien eu a généré mon fichier stub.

    Comme je ne parviens pas à faire marcher mon code, j'ai tenter un petit test que j'ai trouvé sur le site http://jmdoudoux.developpez.com/cours/developpons/java/

    Même la çà ne marche pas ... toujours la même erreur ....

    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
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    	java.lang.ClassNotFoundException: com.acticall.rmi.server.Information (no security manager: RMI class loader disabled)
    	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    	at com.acticall.rmi.client.Rmi.main(Rmi.java:20)
    Caused by: java.lang.ClassNotFoundException: com.acticall.rmi.server.Information (no security manager: RMI class loader disabled)
    	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:531)
    	at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
    	at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
    	at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
    	at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
    	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
    	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
    	... 2 more
    Je ne sais pas si j'ai bien fait, mais mon fichier stub généré, j'en ai fais un zip que j'ai renommé en jar et que j'ai ajouté au classpath de mon serveur.

    Sinon voici le code que je viens de tester :
    CLIENT (j'ai ajouté l'interface à mon package)
    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 com.acticall.rmi.client;
     
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
     
    public class Rmi {
     
    	public static void main(String[] args) {
     
    		try{
    			int remotePort = 1097;
    			String remoteIp = "localhost";
    			//String remoteObjectName = "remoteDispatchMaker";
    			String remoteObjectName = "TestRMI";
     
     
    			Registry registry = LocateRegistry.getRegistry(remoteIp, remotePort);
     
    			// Le nom "remoteObjetName" est le nom logique qui va permettre la communication avec le serveur
    			DispatchMakerRemote dispatchMakerRemote = (DispatchMakerRemote) registry.lookup(remoteObjectName);
     
    			if(dispatchMakerRemote != null 
    					&& dispatchMakerRemote.sendLetter(new String())){
    				System.out.println("SUCCESS");
    			} else {
    				System.out.println("FAILED");
    			}										
    		} 
    		catch (Exception e) {			
    			e.printStackTrace();
    		}									
    	}
    }
    et sur le SERVEUR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package com.acticall.rmi.server;
     
    import java.rmi.Remote;
    import java.rmi.RemoteException;
     
    public interface Information extends Remote {
    	public String getInformation() throws RemoteException;
    }

    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
    package com.acticall.rmi.server;
     
    import java.rmi.registry.Registry;
     
    public class RmiServer {
     
    	public static void main(String[] args) {
    	   try {		     
    		      TestRMIServer testRMIServer = new TestRMIServer();
     
    		      System.out.println("Enregistrement du serveur");
     
    		      Registry reg = java.rmi.registry.LocateRegistry.createRegistry(1097);
     
    		      reg.bind("TestRMI", testRMIServer);		      
     
    		      System.out.println("Serveur lancé");
     
    	   } catch (Exception e) {
    		   System.out.println("Exception capturée: " + e.getMessage());
    	   }
    	}
    }

    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
    package com.acticall.rmi.server;
     
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
     
    public class TestRMIServer extends UnicastRemoteObject implements Information {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	protected TestRMIServer() throws RemoteException {
    		super();
    	}
     
    	public String getInformation()throws RemoteException {
    		return "bonjour";
    	}	
    }
    C'est tout ... et puis le jar que j'ai inclus au classpath et qui contient le stub ....

    Sinon je suis sur RSA ... mais c'est pareil qu'Eclipse

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Problème réglé !

    En fait mon projet était en java 1.4 et mon executable rmic.exe de java 5.
    Or java 5 ne génère que le fichier stub.

    J'ai donc généré mes 2 fichiers skel et stub que j'ai déployé dans un jar. J'ai inclus ce jar dans le classpath du client et du serveur et çà roule !!!

    Sinon voici l'adresse d'un site super sympa :

    http://www-igm.univ-mlv.fr/~roussel/.../java.rmi.html

    Et deux adresses sun qui m'ont permis de résoudre mon problème :
    http://java.sun.com/j2se/1.4.2/docs/...ml#classserver
    et
    http://java.sun.com/j2se/1.4.2/docs/....html#sixStepC

    Merci à tous !!!!!!

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

Discussions similaires

  1. [Framework] [RMI] java.rmi.UnmarshalException
    Par YokoSop dans le forum Spring
    Réponses: 12
    Dernier message: 08/12/2010, 15h29
  2. Java rmi java.security.AccessControlException
    Par smokinaces26 dans le forum Java EE
    Réponses: 1
    Dernier message: 11/02/2010, 13h41
  3. [EJB3 Entity] java.rmi.UnmarshalException: ClassNotFoundException
    Par matthieu86 dans le forum Java EE
    Réponses: 1
    Dernier message: 01/03/2009, 17h46
  4. Java.rmi.NotBoundException (rmi execution client)
    Par charles9 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 21/07/2008, 15h10
  5. Réponses: 2
    Dernier message: 16/01/2007, 23h26

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