RMI Bindung schlägt fehl mit "No security manager: RMI class loader disabled"

Habe ich ein Problem die Bindung eines entfernten Objekts an der RMI-registry. Ich habe meine reduziert-code für ein sehr einfaches Beispiel, das funktioniert, wenn ich test es auf meinem computer (Windows 10). Aber wenn ich es starte auf einem anderen computer (Windows 7), wenn registry.bind(id, remoteObject); aufgerufen wird, bekomme ich diese exception:

java.lang.ClassNotFoundException: 
rmitest.IRemote (no security manager: RMI class loader disabled)

Sollte ich nicht brauchen, einen SecurityManager da alle class Dateien in die jar und ich weiß nicht verwenden möchten, die dynamischen code-laden-Funktion.

Warum muss es versuchen, laden eine Sicherheits-manager, und warum kann Sie nicht finden, selbst wenn ich definieren? Was könnte der Grund sein, dass es funktioniert, auf einer Maschine, aber nicht eine andere? Ich denke, der code ist ok und es müssen einige Konfigurations-Problem, aber ich bin mir nicht sicher, was genau ist falsch konfiguriert.

Hier ist der remote-Schnittstelle und remote-Objekt-Implementierung, die ich Export als runnable Jar in Eclipse als rmitest.jar.

public interface IRemote extends Remote {
    void foo() throws RemoteException;
}
public class RemoteImpl extends UnicastRemoteObject implements IRemote {

    private static Registry     registry;

    public RemoteImpl() throws RemoteException {
        super();
    }

    public static void main(final String[] args) throws Exception {
        try {
            LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        } catch (final Exception e) {
            //already created
        }
        registry = LocateRegistry.getRegistry(Registry.REGISTRY_PORT);
        registry.bind(UUID.randomUUID().toString(), new RemoteImpl());
        System.out.println("Binding successful");
    }

    @Override
    public void foo() throws RemoteException {
        System.out.println("foo");
    }
}

Hier wird der volle stack-trace, wirft Sie in die Zeile, wo registry.bind aufgerufen wird, und ist genau das gleiche beim ausführen mit einem der folgenden Befehle:
java -jar rmitest.jar oder

java -Djava.security.manager -Djava.security.policy=policy -jar rmitest.jar

Es ist sehr merkwürdig, dass offenbar in beiden Fällen ein security-manager ist erforderlich, aber auch im zweiten Fall kann es nicht finden.

Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: rmitest.IRemote (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at rmitest.RemoteImpl.main(RemoteImpl.java:29)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: rmitest.IRemote (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: rmitest.IRemote (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
    at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
    at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    ... 15 more

Hier ist die policy-Datei, die sollten alles erlauben:

grant {
  permission java.security.AllPermission;
};
  • Es nicht 'versuchen, laden ein security manager', und es gibt hier nichts, was anders vermuten. Es versucht zu laden Ihrer Klasse, und nicht finden. Nicht zu Schlussfolgerungen zu springen.
  • Was ich sagen wollte war "erwartet, ein Sicherheits-manager vorhanden sein", so interpretiere ich das exeption-Meldung zu vermuten, dass eine fehlende security-manager, ist der Grund, warum die Klasse nicht geladen werden kann.
  • Nun, es bedeutet nicht, entweder von diesen Dingen. Es ist ein Hinweis, dass der security manager nicht ausgeführt wird. Nicht der Grund.
InformationsquelleAutor kapex | 2017-01-26
Schreibe einen Kommentar