在Java中更改系统属性

在Java中更改系统属性,java,securitymanager,Java,Securitymanager,我试图学习JINI库,并找到了简单程序的示例。节目安排如下: package book.basic; import net.jini.core.discovery.LookupLocator; import net.jini.core.lookup.ServiceRegistrar; import java.rmi.RMISecurityManager; import java.rmi.RemoteException; /** * UnicastRegistrar.java */ publ

我试图学习JINI库,并找到了简单程序的示例。节目安排如下:

package book.basic;
import net.jini.core.discovery.LookupLocator;
import net.jini.core.lookup.ServiceRegistrar;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;

/**
 * UnicastRegistrar.java
 */
public class UnicastRegister {
    static public void main(String argv[]) throws RemoteException {
        new UnicastRegister();
    }
    public UnicastRegister() throws RemoteException {
        LookupLocator lookup = null;
        ServiceRegistrar registrar = null;
        System.setSecurityManager(new RMISecurityManager());
        try {
            lookup = new LookupLocator("jini://localhost");
        } catch(java.net.MalformedURLException e) {
            System.err.println("Lookup failed: " + e.toString());
            System.exit(1);
        }
        try {
            registrar = lookup.getRegistrar();
        } catch (java.io.IOException e) {
            System.err.println("Registrar search failed: " + e.toString());
            System.exit(1);
        } catch (java.lang.ClassNotFoundException e) {
            System.err.println("Registrar search failed: " + e.toString());
            System.exit(1);
        }

        System.out.println("Registrar found");
// the code takes separate routes from here for client or service
    }
} // UnicastRegister
如果运行此应用程序,则引发异常:

线程主java.security.AccessControlException中的异常: 拒绝访问java.net.SocketPermission 127.0.0.1:4160 连接,解析 java.security.AccessControlContext.checkPermissionAccessControlContext.java:372 在 java.security.AccessController.checkPermissionAccessController.java:559 在 java.lang.SecurityManager.checkPermissionSecurityManager.java:549 在java.lang.SecurityManager.checkConnectSecurityManager.java:1051 在java.net.Socket.connectSocket.java:574 at java.net.Socket.connectSocket.java:528 at java.net.Socket.Socket.java:425 at java.net.Socket.Socket.java:241 at net.jini.core.discovery.LookupLocator.getRegistrLookupLocator.java:328 在 net.jini.core.discovery.LookupLocator.getRegistrLookupLocator.java:286 在book.basic.unicastergister.unicastergister.java:26 at book.basic.unicastergister.main unicastergister.java:12 at sun.reflect.NativeMethodAccessorImpl.invoke0Native方法位于 sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:57 在 sun.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java:606 at com.intellij.rt.execution.application.AppMain.mainAppMain.java:120

我创建了策略文件policy.all并将其放在主目录中:

此文件包含以下文本:

grant {
    permission java.security.AllPermission;
};
接下来,我需要在命令行中将此文件作为参数传递: -Djava.security.manager-Djava.security.policy=/policy.all, 更像这样-Djava.security.manager-Djava.security.policy=./policy.all 我这样做的初衷是:

我得到下一个编译错误:

如果我尝试直接这样设置策略文件:

System.setProperty("java.security.policy","file:/policy.all");
System.setSecurityManager(new RMISecurityManager());
它不产生任何结果,我再次得到java.security.AccessControlException