Подтвердить что ты не робот

Запуск rmi-сервера, classnotfound

Привет, Я пытаюсь запустить приложение Java, которое связывает класс с сервером именования, но я постоянно получаю ClassNotFoundException

Сначала я запустил реестр:

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)

4b9b3361

Ответ 1

Запустите команду rmiregisrty из папки /bin,/build или/build/classes, в зависимости от того, какая папка является корнем ваших встроенных файлов.

Я потратил полдня, пытаясь решить ту же самую вещь.

Ответ 2

Исключение возникает из-за того, что приложение 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.

Ответ 3

Хорошо, я только что преодолел эту проблему. Убедитесь, что при запуске rmiregistry установлена ​​ваша переменная среды CLASSPATH.

Например, у вас может быть script:

set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe

Это все, что мне нужно, чтобы заставить мой потерянный класс работать. Я не уверен, как отправить -cp commandline в rmiregistry.exe. Его документации недостаточно.

Ответ 4

Я уверен, что вам нужно будет запустить свой RMI-сервер, используя тот же путь к классам, что и ваше приложение. Я считаю, что он принимает те же параметры, что и java, т.е. -cp [your class path].

Ответ 5

попробуйте добавить /bin в конце вашей виртуальной машины Arg:

-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin

Файл, который вы запустите, находится в этом каталоге, поэтому вам нужно включить его в путь.

Ответ 7

У меня была такая же проблема, чтобы исправить это, чтобы ваш CLASSPATH был установлен на путь, содержащий классы сервера при запуске rmiregistry.

На машине Linux выполните следующие команды.

export CLASSPATH="<server_class_path>"

Убедитесь, что установлен CLASSPATH:

echo $CLASSPATH

Как только путь класса был установлен, запустите rmiregistry

rmiregistry &

Ответ 8

Закройте окно cmd, где изначально был запущен rmiregistry. В новом cmd перейдите в расположение, в котором находятся файлы классов вашего проекта (uptill bin), и запустите реестр с помощью следующей команды:

rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false

Если вы используете Eclipse, запустите ServerSideProject, и ваш экземпляр PracticeClass будет привязан к указанному URL-адресу.

Просто напечатайте строку ниже метода привязки и посмотрите, будет ли он напечатан. Если он напечатан успешно, это означает, что ваш сервер работает нормально.

Ответ 9

Я потратил целый день на удаление и переустановку JDK и изменение переменных classpath и переменных среды. Но виновником было то, что команда начать rmigregistry не смогла запустить rmiregistry надлежащим образом. Итак, спасибо за комментарии на этой странице, решение было временно отключить CLASSPATH. И это делается с помощью команды set CLASSPATH=