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

я решил его с именем переименования. сервер и клиент находятся в двух разных проектах, но с тем же наименованием пакетов.