2014-12-05 63 views
1

我想看哪學習RMI通過遵循Oracle documentation for RMIRMI服務器調用拋出拋出java.lang.ClassNotFoundException:compute.Compute

我已經創建了服務器端和客戶端的類,這個類的細節如下:

compute.Compute -- Remote interface 
compute.Task -- Normal interface 
engine.ComputeEngine -- Class that implements remote interface 

代碼的細節可以從文件中的這些鏈接可以顯得:

http://docs.oracle.com/javase/tutorial/rmi/designing.html http://docs.oracle.com/javase/tutorial/rmi/implementing.html

我已經按照下面鏈接中給出的步驟來編譯代碼,我所做的所有這些都在我的機器上,它具有Ubuntu操作系統。

http://docs.oracle.com/javase/tutorial/rmi/compiling.html

現在按下面的鏈接我已經把客戶端和服務器的策略文件的路徑:/home/user/public_html

http://docs.oracle.com/javase/tutorial/rmi/running.html

一個更加不同的是我已經在使用Tomcat服務器,所以我把班Tomcat webapps和我的web應用程序下的文件,所以我正在使用命令運行該類:

java -cp /home/user/src:. -Djava.rmi.server.codebase=http://myipaddress:8080/myapp/classes/compute.jar -Djava.rmi.server.hostname=myipaddress -Djava.security.policy=server.policy engine.ComputeEngine 

現在,當我運行該應用程序我得到的例外是:

ComputeEngine exception: 
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: compute.Compute 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at engine.ComputeEngine.main(ComputeEngine.java:31) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: compute.Compute 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassNotFoundException: compute.Compute 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1206) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:270) 
    at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1219) 
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:729) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:673) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:610) 
    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:1558) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1e exce514) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    ... 13 more 

異常說java.lang.ClassNotFoundException: compute.Compute。但是我對compute.jar位於在我的道路/home/user/src類文件,我也可以在http://myipaddress:8080/myapp/classes/compute.jar

使用網址下載也僅供參考,我做我的機器上的所有步驟不作任何單獨的客戶機和服務器。

有人可以幫我嗎我該如何解決這個問題?請讓我知道,如果你需要任何進一步的細節,所以我可以提供他們。

更新:

我跟着這個職位由@EJP給出的asnwer - Is it necessary/important to set a classpath in the RMI registry?

然後我就開始從目錄rmiregistry在那裏我有Compute.class的jar文件,然後運行下面的命令:

java -cp /home/user/src:/home/user/public_html/classes/compute.jar -Djava.rmi.server.codebase=http://myipaddress:8080/myapp/classes/compute.jar -Djava.rmi.server.hostname=myipaddress -Djava.security.policy=server.policy engine.ComputeEngine 

但我仍然得到同樣的例外。

+0

我在重複問題中的答案沒有說明在包含JAR文件的目錄中啓動註冊表。但它確實提供了我所知的其他三種工作解決方案。另見[here](http://stackoverflow.com/a/23643744/207421)。 – EJP 2014-12-05 22:47:06

回答

0

該類不在註冊表的CLASSPATH中。

+0

根據文件,它沒有提到任何地方。你能告訴我如何將它放在註冊表類路徑中嗎? – user3181365 2014-12-05 18:05:23

+0

我在其他帖子中關注了其中一個答案,但是我收到了同樣的錯誤,請查看我更新的帖子以瞭解詳細信息。 i – user3181365 2014-12-05 18:27:45

+0

爲什麼需要在任何地方提及?註冊表是一個Java程序,它運行在一個JVM中,它有一個類路徑,它像其他任何Java代碼一樣拋出'ClassNotFundExceptions'。 – EJP 2014-12-05 22:42:31