Java 使用 SecurityManager 策略文件发送 JAR

Java Shipping JAR with SecurityManager Policy File

我正在尝试发布一个执行某些 RMI 调用的 Java 应用程序。

我需要将其作为 JAR 文件发送(这是一项要求,没有办法解决)。

现在,为了允许某些事情(比如套接字和 RMI 连接),我需要一个 SecurityManager 和一个策略文件。

我想将此策略文件传送到 jar 中并从 JAR 中设置策略路径。

现在,我的代码是这样的:

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

        ... /* All other code */

}

当我将路径更改为我 PC 上的路径并且 运行 没有 JAR 的代码(An IntelliJ 'Application')时,我在启动我的应用程序时没有任何问题,当我尝试 运行 我的 JAR,我得到以下异常:

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

我感觉我设置的路径是错误的,谁能告诉我这条路径应该是什么?

我能够通过将我的代码更改为以下内容来解决此问题:

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();

    ...

我没有尝试手动找出路径,而是让 Java 帮我修复它。