Ich versuche, eine RMI-Server zu erstellen, aber ich bekomme die folgende Ausnahme zur Laufzeit:Java RMI/Zugriff verweigert
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:4555" "listen,resolve")
Ich habe die Oracle-Tutorial über die Richtliniendateien lesen, hier ist der Inhalt meines Servers. Policy-Datei, die ich in den Ordner src eingefügt:
grant codeBase "file:///C:/EclipseProjects/MultiServiceServer/src"{
permission java.security.AllPermission;
};
ich auch auf VM Argumente gesetzt:
-Djava.security.policy=src/server.policy
, hier Schließlich ist der Code dieser einfachen RMI-Server:
public class Main {
public static void main(String[] args)
{
System.out.println("Server is running..");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "AvailableService";
AvailableService service = new ServiceList();
AvailableService stub = (AvailableService)UnicastRemoteObject.exportObject(service, 0);
LocateRegistry.createRegistry(4555);
Registry reg = LocateRegistry.getRegistry(4555);
reg.bind(name, stub);
System.out.println(name+" bound");
} catch(Exception e){e.printStackTrace();}
}
Vielen Dank für Ihre Hilfe.
Wenn ich den Sicherheitsmanager nicht verwende, erhalte ich eine weitere Ausnahme (kein Sicherheitsmanager: RMI Classloader deaktiviert), wenn ich versuche, von Clientseite zu Objekt auf der Serverseite zu verweisen. Ich habe gelesen, dass der Sicherheitsmanager Klassen über RMI laden muss. – freestar
Die Nachricht sagt 'ClassNotFoundException', und es erwähnt '(kein Sicherheitsmanager)' in Klammern als eine Bemerkung. Das * Problem * ist nicht 'kein Sicherheitsmanager', es ist 'ClassNotFoundException'. Die Lösung besteht darin, den Sicherheitsmanager nicht hinzuzufügen, sondern die fehlende Klasse dem Klassenpfad der JVM hinzuzufügen, der die Ausnahme auslöst. Der Sicherheitsmanager wird unter den angegebenen Bedingungen benötigt und keine anderen. – EJP