RemoteException java.rmi.UnmarshalException: ошибка отмены unmarshalling
Я запускаю программу здесь на двух JVM на разных физических машинах. Я получаю ошибку
RemoteException
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manager: RMI class loader disabled)
Я даже пытался запустить его на одном компьютере (неизменная программа), и он работает, но он не работает на компьютерах с разной степенью сжатия. Может ли кто-нибудь помочь мне?
@beny23- Спасибо, но я до сих пор получаю эту ошибку:
RemoteException
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: CalculatorImpl_Stub
Как клиентская сторона может иметь копию CalculatorImpl_stub?
Ответы
Ответ 1
Похоже, что вы не используете менеджера безопасности:
У вас есть файл политики (my.policy
):
grant {
permission java.security.AllPermission;
};
и запустите свою программу, используя
java -Djava.security.manager -Djava.security.policy=/some/path/my.policy MyClass
Ответ 2
У меня была эта проблема, потому что у меня были разные имена пакетов в клиентском и серверном коде:
package my.pkg;
// server side interface definition...
// ------------- //
package my.pkg.something;
// client side interface definition...
Я изменил имя клиентского пакета и установил его как имя серверного пакета:
package my.pkg;
// server side interface definition...
// ------------- //
package my.pkg; // renamed to the name of package in server-side .
// client side interface definition...
и проблема исчезла.
Ответ 3
У меня были рабочие RMI Client
и Server
для моего Java-класса. Я решил разместить их в своих собственных пакетах, а не работать как пакет по умолчанию.
После того, как я поместил их в свои пакеты, ошибка java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException:
начала происходить при подключении.
Я вернул программы обратно в пакет по умолчанию, и все это снова заработало.
Я понимаю, что для этого, вероятно, есть техническая причина, но это сработало для меня!
Ответ 4
Существует три случая.
-
Если вы получаете ошибку при привязке к реестру, реестр не имеет доступа к этому классу в своем пути к классам или с помощью функции кодовой базы.
-
Если вы обнаружите ошибку при поиске реестра, ваш клиент не имеет доступа к этому классу в своем пути к классам или через функцию кодовой базы.
-
Если вы используете функцию codebase, это, в свою очередь, может быть вызвано тем, что реестр имеет доступ к этому классу в своем пути к классам, что заставляет его не использовать кодовую базу, что приводит к потере аннотации кода, поэтому ваш клиент не знает, как использовать кодовую базу для этого класса.
-
Если вы не используете функцию codebase, игнорируйте предыдущий абзац; -)
Ответ 5
я решил его с именем переименования. сервер и клиент находятся в двух разных проектах, но с тем же наименованием пакетов.