2017-12-22 1 views
0

Ich versuche, eine Java-Anwendung zu versenden, die einige RMI-Aufrufe durchführt.Java-Versand-JAR mit SecurityManager-Richtliniendatei

Ich muss dies als JAR-Datei (Es ist eine Anforderung, keine Möglichkeit, um es).

Jetzt, um bestimmte Dinge (wie Sockets und RMI-Verbindungen) zu erlauben, brauche ich einen SecurityManager und eine Richtliniendatei.

Ich möchte diese Richtliniendatei innerhalb des JAR senden und den Richtlinienpfad innerhalb des JAR festlegen.

Im Moment ist es das, was mein Code wie folgt aussieht:

public static void main(String[] args) 
{ 
     System.setProperty("java.security.policy","jar:file:/Policies/Server.policy"); 
     Policy.getPolicy().refresh(); 

     ... /* All other code */ 

} 

Wenn ich den Pfad ändern ein Pfad auf meinem PC zu sein und den Code ohne JAR (ein IntelliJ ‚Anwendung‘) laufen Ich habe keine Probleme meine Anwendung starten, Wenn ich versuche, meine JAR zu laufen, ich die folgende Ausnahme erhalten:

Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:2000" "listen,resolve") 

ich das Gefühl, den Weg habe ich falsch eingestellt ist, kann mir jemand bitte sagen, was dieser Weg sollte sein?

+0

Können Sie den Inhalt der Datei lesen und drucken, wenn Sie sie von JAR ausführen? – amitmah

Antwort

1

konnte ich dieses Problem beheben, indem der Code die folgende Veränderung:

public static void main(String[] args) 
{ 
    boolean quit = false; 

    String serverPolicyPath = "/Policies/Server.policy"; 
    URL serverPolicyURL = Main.class.getResource(serverPolicyPath); 

    if (serverPolicyURL == null) 
    { 
     System.err.println("getResource returned NULL"); 
     return; 
    } 

    System.setProperty("java.security.policy",serverPolicyURL.toString()); 
    Policy.getPolicy().refresh(); 

    ... 

Statt manuell den Weg, um herauszufinden, zu versuchen, ich Java für mich reparieren es einfach lassen.