2012-12-28 92 views
7

我需要你的幫助,圍繞JAVA RMI,我開發了一個示例程序來對錶進行排序。但我得到這個異常:java.rmi.UnmarshalException:錯誤解組參數;嵌套的異常是:java.lang.ClassNotFoundException:ServicesTableau

Erreur RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: ServicesTableau 

,這是我的服務器的源代碼:

public class Serveur { 
    public static void main(String args[]) { 

     try { 

      System.out.println("Server start ..."); 
      ServicesTableauImpl od = new ServicesTableauImpl(); 
      String url = "rmi://" + args[0] + "/ServicesTableauImpl"; 
      System.out.println("Passe"); 
      Naming.rebind(url, od); 
      System.out.println("Attente d'invocations de client/CTRL-C pour stopper"); 
     } catch (Exception e) { 
      System.out.println("Erreur " + e.getMessage()); 
     } 
    /* 
    catch(java.net.MalformatedURLException e){ 
    System.out.println("Mauvais nom de serveur"); 
    System.exit(1); 
    } 
    catch(RemoteException e){ 
    System.out.println("Pas de Rmiregistry"); 
    System.exit(1); 
    } 
    */ 
    } 
} 
+1

這個類ServicesTableauImpl在類路徑中可用嗎? –

回答

10

這個類是不可用的RMI註冊的CLASSPATH。修復它的最簡單方法是通過LocateRegistry.createRegistry().在相同的JVM中啓動註冊表將結果存儲在靜態字段中。

+0

我在Linux下工作,感謝你的回覆(我用rmiregistry現在工作正常) – MDIT

+0

Linux對答案沒有任何影響。 – EJP

-2

此錯誤是因爲沒有編寫安全管理器代碼,因爲該類無法加載。 因此,請確保您爲安全管理員添加代碼。  
如果編譯器找不到安全管理器,則創建一個新的。在main方法中添加代碼。

if (System.getSecurityManager() == null) then 
    System.setSecurityManager(new RMISecurityManager()) 
+0

不,它不是。這是由於這個班沒有被找到。您需要閱讀整個例外。這只是由於缺乏安全管理員,如果他使用的RMI代碼庫功能,這是沒有說明。 – EJP

0

在某些情況下,您需要將rmi客戶端代碼(接口和主)移動到默認包。重複它的服務器端。它可以解決你的問題(與rmi包裝工作並不那麼明顯)。

相關問題