2014-12-05 1 views
1

Я пытаюсь вот научиться RMI, следуя Oracle documentation for RMIвызов сервера RMI бросает 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 OS.

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 и под моим веб-приложением, поэтому я запускаю класс, используя команду:

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, а также я могу загрузить его, используя URL в http://myipaddress:8080/myapp/classes/compute.jar

Также FYI, я делаю все шаги, на моей машине только без каких-либо отдельных машин клиента и сервера.

Может кто-нибудь, пожалуйста, помогите мне, как я могу исправить эту проблему? Пожалуйста, дайте мне знать, если вам нужны какие-либо подробности, чтобы я мог их предоставить.

Update:

Я следовал за asnwer, данное @EJP на этом посту - Is it necessary/important to set a classpath in the RMI registry?

тогда я начал rmiregistry из директории, где у меня есть .jar файл, который имеет Compute.class, а затем побежал следующую команду :

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. Тем не менее, он дает только три других рабочих решения, о которых я знаю. См. Также [здесь] (http://stackoverflow.com/a/23643744/207421). – EJP

ответ

0

Этот класс не находится в CLASSPATH реестра.

+0

В соответствии с документом нигде не упоминается. Не могли бы вы рассказать мне, как разместить это путь к классу реестра? – user3181365

+0

Я следил за одним из ваших ответов в другом посте, но я получаю такую ​​же ошибку, пожалуйста, проверьте мое обновленное сообщение для деталей. i – user3181365

+0

Зачем это нужно упоминать в любом месте? Реестр - это Java-программа, она запускается в JVM, имеет путь к классам, она генерирует «ClassNotFundExceptions» так же, как и любой другой Java-код. – EJP