Ответ 1
Запустите команду rmiregisrty
из папки /bin,/build или/build/classes, в зависимости от того, какая папка является корнем ваших встроенных файлов.
Я потратил полдня, пытаясь решить ту же самую вещь.
Сначала я запустил реестр:
rmiregistry
то из eclipse я пытаюсь выполнить сервер, но получаю эту ошибку
java.rmi.ServerException: RemoteException произошло в потоке сервера; Вложенное исключение: java.rmi.UnmarshalException: ошибочные аргументы; Вложенное исключение: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) на sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) на sun.rmi.transport.Transport $1.run(Transport.java:159) в java.security.AccessController.doPrivileged(собственный метод) на 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) в java.util.concurrent.ThreadPoolExecutor $Worker.runTask(ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:908) в java.lang.Thread.run(Thread.java:619) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) на sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) at sun.rmi.registry.RegistryImpl_Stub.rebind(Неизвестный источник) на progInternet2008.Pozzobon.tesi.Slave.main(Slave.java:54) Вызвано: java.rmi.UnmarshalException: ошибки для отмены сортировки; Вложенное исключение: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory at sun.rmi.registry.RegistryImpl_Skel.dispatch(Неизвестный источник) at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386) на sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) на sun.rmi.transport.Transport $1.run(Transport.java:159) в java.security.AccessController.doPrivileged(собственный метод) на 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) в java.util.concurrent.ThreadPoolExecutor $Worker.runTask(ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:908) в java.lang.Thread.run(Thread.java:619) Вызвано: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory на java.net.URLClassLoader $1.run(URLClassLoader.java:200) в java.security.AccessController.doPrivileged(собственный метод) в java.net.URLClassLoader.findClass(URLClassLoader.java:188) в java.lang.ClassLoader.loadClass(ClassLoader.java.307) в java.lang.ClassLoader.loadClass(ClassLoader.java:252) в java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) в java.lang.Class.forName0 (собственный метод) в java.lang.Class.forName(класс .java:247) на sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711) на sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655) на sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592) в java.rmi.server.RMIClassLoader $2.loadProxyClass(RMIClassLoader.java:628) на java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294) на sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238) в java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531) в java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493) в java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1329) в java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) ... еще 12
Я прочитал учебник RMI Java, но все еще не мог заставить его работать...
В качестве аргументов VM я установил это:
-Djava.rmi.server.codebase = файл: ${workspace_loc}/progInternet2008
Пожалуйста, помогите мне
(Я использую Java 6)
Запустите команду rmiregisrty
из папки /bin,/build или/build/classes, в зависимости от того, какая папка является корнем ваших встроенных файлов.
Я потратил полдня, пытаясь решить ту же самую вещь.
Исключение возникает из-за того, что приложение rmiregistry не знает, куда загружать классы. Когда вы пытаетесь связать объект в реестре RMI, реестр загружает определение класса для этого объекта. Некоторые из других ответов говорят вам обойти это, установив путь к классу для приложения rmiregistry, чтобы он имел определения класса при его запуске и не нуждался в загрузке, но учебник Sun Java RMI явно говорит о том, чтобы не делать этого. Я подозреваю, что это может вызвать конфликты между версией класса в реестре и классом на сервере.
Правильный способ справиться с проблемой состоит в том, чтобы установить свойство java.rmi.server.codebase, которое вы пытались сделать. Свойство требует, чтобы путь к каталогу был завершен с помощью косой черты, например:
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/
У вас может также возникнуть проблема, если переменная ${workspace_loc} является относительным путем, и приложение rmiregistry не запускалось в том же каталоге, чтобы относительный путь был неправильным для него. Если вы либо сделаете путь абсолютным, либо запустите rmiregistry в соответствующем каталоге, ClassNotFoundException должен исчезнуть. Для получения более подробной информации см. учебник по свойству java.rmi.server.codebase.
Хорошо, я только что преодолел эту проблему. Убедитесь, что при запуске rmiregistry
установлена ваша переменная среды CLASSPATH
.
Например, у вас может быть script:
set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe
Это все, что мне нужно, чтобы заставить мой потерянный класс работать. Я не уверен, как отправить -cp commandline
в rmiregistry.exe
. Его документации недостаточно.
Я уверен, что вам нужно будет запустить свой RMI-сервер, используя тот же путь к классам, что и ваше приложение. Я считаю, что он принимает те же параметры, что и java, т.е. -cp [your class path]
.
попробуйте добавить /bin в конце вашей виртуальной машины Arg:
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin
Файл, который вы запустите, находится в этом каталоге, поэтому вам нужно включить его в путь.
Я обновил с JDK1.6.0_33 до 1.7.0_45 и имел ту же проблему. Я нашел этот документ и решил проблему, запустив rmiregistry с помощью:
rmiregistry -Djava.rmi.server.useCodebaseOnly = false
См. ниже http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html
У меня была такая же проблема, чтобы исправить это, чтобы ваш CLASSPATH был установлен на путь, содержащий классы сервера при запуске rmiregistry.
На машине Linux выполните следующие команды.
export CLASSPATH="<server_class_path>"
Убедитесь, что установлен CLASSPATH:
echo $CLASSPATH
Как только путь класса был установлен, запустите rmiregistry
rmiregistry &
Закройте окно cmd, где изначально был запущен rmiregistry. В новом cmd перейдите в расположение, в котором находятся файлы классов вашего проекта (uptill bin), и запустите реестр с помощью следующей команды:
rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false
Если вы используете Eclipse, запустите ServerSideProject, и ваш экземпляр PracticeClass будет привязан к указанному URL-адресу.
Просто напечатайте строку ниже метода привязки и посмотрите, будет ли он напечатан. Если он напечатан успешно, это означает, что ваш сервер работает нормально.
Я потратил целый день на удаление и переустановку JDK и изменение переменных classpath и переменных среды. Но виновником было то, что команда начать rmigregistry не смогла запустить rmiregistry надлежащим образом. Итак, спасибо за комментарии на этой странице, решение было временно отключить CLASSPATH. И это делается с помощью команды set CLASSPATH=