У меня есть приложение FooApplication
(код в foo.jar
) с плагином BarPlugin
(код в foo-bar-plugin.jar
). Приложение создает экземпляр плагина динамически. Работает отлично.
FooApplication имеет некоторые функции, доступные через интерфейс RMI FooRemote
. Это также прекрасно работает, за исключением одной вещи. У FooRemote
есть метод доступа к Remote
объектам, экспортируемым плагинами, и я получаю исключение java.rmi.UnmarshalException при попытке передать один из этих плагинов клиенту RMI.
public interface FooRemote extends Remote
{
/* other methods */
public RemoteControl getPluginRemoteControl(int i) throws RemoteException;
}
/** just a named Remote object for debugging purposes */
public interface RemoteControl extends Remote
{
public String getName() throws RemoteException;
}
В FooRemoteImpl я делаю следующее:
/* just a test object */
private static class RC0 extends UnicastRemoteObject implements RemoteControl
{
public RC0() throws RemoteException { super(); }
@Override public String getName() throws RemoteException { return "RC0"; }
}
@Override public RemoteControl getPluginRemoteControl(int i)
throws RemoteException
{
int j = i;
if (j <= 0)
return new RC0();
Collection<RemoteControl> rclist = this.model.getApplicationPluginRemotes();
for (RemoteControl rc : rclist)
{
if (--j == 0)
return rc;
}
return null;
}
Когда я звоню FooRemote.getPluginRemoteControl(0)
, он передает экземпляр моего фиктивного класса RC0
и отлично работает с клиента. Когда я звоню FooRemote.getPluginRemoteControl(1)
, он пытается раздать один из реальных пультов плагинов, и он терпит неудачу:
??? Java exception occurred:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: com.example.plugin.BarPluginRemoteControl (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy5.getPluginRemoteControl(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.example.plugin.BarPluginRemoteControl (no security manager: RMI class loader disabled)
[ more stuff deleted ]
Что дает?