2010-09-02 178 views
3

當我嘗試運行使用遠程註冊表的服務器時,我正在從RMI獲取異常。RMI服務器異常

我在Server2中類的主要方法註冊表鱈魚是

Registry registry = LocateRegistry.getRegistry("192.168.1.4",1100); 
registry.rebind("Hello",stub); 

192.168.1.4是在同一個局域網其他機器。

請幫幫我。

Server2 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.RemoteHello2 
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.RemoteHello2 
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
at sun.rmi.transport.Transport$1.run(Transport.java:159) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:619) 
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) 
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
at example.Hello.Server2.main(Server2.java:29) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: example.Hello.RemoteHello2 
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
at sun.rmi.transport.Transport$1.run(Transport.java:159) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:619) 

我叫RemoteHello2類,我可以證實這一點,因爲在同一包裝的另一個服務器程序運行良好。

我有2個服務器程序,1個使用localhost作爲註冊表,2個使用遠程服務器作爲註冊表。

+0

提示:ClassNotFoundException:example.Hello。RemoteHello2 – OscarRyz 2010-09-02 17:29:37

+0

順便說一句,出於安全原因,您無法[重新]綁定()到非本地RMI註冊表。 – gawi 2010-09-02 18:36:52

回答

0

拋出java.lang.ClassNotFoundException: example.Hello.RemoteHello2

因此,它看起來像你缺少類從服務器上的類路徑?

+0

我不這麼認爲。 因爲我有另一個類Server1,它實際上連接到註冊表在同一個盒子,它運作良好。 兩者都使用相同的遠程接口。 – Shew 2010-09-02 17:34:23

+0

但是從我所看到的,你正在運行server2(它位於堆棧跟蹤的底部),在線路上執行某些操作,而另一方無法找到您的服務器類。你不能在服務器端調試? – 2010-09-02 23:30:03

4

這裏是故障排除提示from RMI guide:試試吧!這應該有助於

6.1如果遇到運行的RMI服務器

你可能會遇到的第一個問題是在收到一個ClassNotFoundException的嘗試綁定或重新綁定遠程對象的名稱時出現問題註冊表。 此異常通常是由於代碼庫屬性格式錯誤導致註冊表無法找到遠程對象的存根或存根所需的其他類。

重要的是要注意遠程對象的存根實現與遠程對象本身所有相同的接口,因此這些接口以及聲明爲方法參數或返回值的任何其他自定義類也必須可用於從指定的代碼庫下載。

大多數通常,由於忽略了該屬性的URL值後面的斜槓而導致此異常。其他原因包括:該財產的價值不是網址; URL中指定的類的路徑不正確或拼寫錯誤;存根類或任何其他必需的類並非都可從指定的URL獲得。

還要檢查類似的問題running rmi server, classnotfound

+0

我沒有運行我的客戶端代碼。當我嘗試啓動我的服務器時出現此錯誤。 正如我所解釋的,我的服務器使用遠程註冊表(不是本地的)來綁定名稱。 – Shew 2010-09-02 17:52:38

+0

你有沒有開始rmiregistry? – YoK 2010-09-02 18:12:37

0

如果本地註冊表的情況下工作,但沒有一個是遠程的,那麼我猜是你java.server.codebase要麼使用文件:URL,遠程註冊表無法訪問遠程註冊表,或者遠程註冊表無法訪問http:或ftp:codebase。

17

我有這個問題。事實證明,我已經通過命令提示符像普通啓動rmi註冊表,但是我沒有在我的server.class文件夾中啓動它。當我將目錄更改爲server.class所在的位置時,它沒有任何問題。

+0

這可能與A. Levy的答案在http://stackoverflow.com/questions/464687/running-rmi-server-classnotfound – Roberto 2013-02-16 15:02:31

+1

這真的有幫助提示 – smas 2013-04-21 10:40:28