2010-10-05 17 views
0

J'ai écrit un code RMI simple pour apprendre comment cela fonctionne. Alors que tout fonctionne bien compiler le code java, le rmic et exécuter rmiregistry et exécuter le code client de la console fonctionne bien, mais quand je choisis de "courir en tant qu'application Java" sur le code client d'Eclipse, il lève MarshallException.Le code client RMI exécuté sur Eclipse déclenche MarshalException tandis que l'exécution à partir de la console fonctionne correctement

Ma conjecture est un peu Eclipse compile avec la version différente selon:

java.rmi.MarshalException

J'ai vérifié le réglage du compilateur Eclipse et il dit 1.6. (clic droit sur l'Explorateur de projet et choisissez « facettes du projet », vous verrez quelle version l'Eclipse compile les fichiers java)

Mon Java est 1.6 donc indépendamment de la compilation du code de la console et Eclipse devrait aboutir à 1.6 la version fichiers de classe conformes. (javap -verbose | grep -i version apporte la version 50 qui est équivalent à 1.6)

Quelqu'un a-t-il rencontré le même problème et a-t-il des explications à ce sujet?

Probablement pas nécessaire mais le code de travail est ci-dessous.

code client

package com.masatosan.remote.client; 

import java.rmi.Naming; 
import java.rmi.RemoteException; 

import com.masatosan.remote.server.MyRemoteServer; 

public class MyRemoteClient { 

    public static void main(String[] args) { 
     new MyRemoteClient().go(); 
    } 

    public void go() { 
     try { 
      MyRemoteServer service = (MyRemoteServer) Naming.lookup("rmi://127.0.0.1/MyFirstRemoteService"); 
      String s = service.sayHello(); 

      System.out.println(s); 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Code Serveur

package com.masatosan.remote.server; 

import java.rmi.Naming; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class MyRemoteServerImp extends UnicastRemoteObject implements MyRemoteServer { 

    public static void main(String[] args) { 
     try { 
      MyRemoteServer service = new MyRemoteServerImp(); 
      Naming.rebind("MyFirstRemoteService", service); 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public MyRemoteServerImp() throws RemoteException {} 

    @Override 
    public String sayHello() throws RemoteException { 
     return "Hi I'm server!"; 
    } 
}// 

interface code serveur pour stub

package com.masatosan.remote.server; 

import java.rmi.Remote; 
import java.rmi.RemoteException; 

public interface MyRemoteServer extends Remote { 

    public String sayHello() throws RemoteException; 
} 

Répondre

1

Le v L'ersion en question n'est pas la version de JRE mais la version des classes appelée. Cela signifie que votre client appelle un autre jeu de bocaux dans Eclipse. En général, si eclipse et la console donnent des résultats différents, c'est presque toujours un problème de classpath.

Cochez la section "Java Build Path" de votre projet et tous les projets associés pour vous assurer que tout correspond. Gardez un œil sur le jar qui a 'com.masatosan.remote.server.MyRemoteServer', je crois que c'est celui qui a le problème de version. Le pot sur lequel l'éclipse est pointée peut être différent et/ou périmé. Voici quelques endroits à vérifier dans la section de chemin de construction de votre projet

1) Assurez-vous que vous utilisez correctement l'onglet 'projets'.

2) Assurez-vous que tous les bocaux dans l'onglet « bibliothèques » sont les mêmes que lors de la compilation sur la console

3) Assurez-vous que qu'aucun des pots qui devraient être inclus par les « projets 'onglet sont dans l'onglet' bibliothèques '. J'ai vu beaucoup de gens taire leurs cheveux parce qu'éclipse utilisait des jars qui n'étaient mis à jour que s'ils étaient compilés à partir de la ligne de commande.

4) Jouez avec l'onglet 'Commander et exporter'. Si quelque chose est au-dessus de quelque chose d'autre, il est chargé en premier. La version qui est chargée en premier est la version utilisée.Si votre application de ligne de commande et votre projet eclipse ont les mêmes fichiers jar, mais les incluent dans un ordre différent, vous pouvez rencontrer ces problèmes.

5) Certains jars peuvent être installés directement dans le JRE en les incluant dans le répertoire JRE. Ceci est très improbable, mais vous pouvez vérifier que l'éclipse JRE utilise et assurez-vous que c'est la même que la console.

Bonne chance, les problèmes de classpath sont très difficiles.