19

作成中の RMI アプリを起動しようAccessControlException: access deniedとするとエラーが発生します。現在、ポリシー ファイルをデフォルト ポート 1099 または別の動的ポートで開くと、この例外が発生する理由がわかりません。すべてを付与します (アプリの終了時に変更されます)。

私はそれがどこで間違っているのかについて行き詰まっています。どんな助けでも大いに役立ちます

私のコード

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
     if (System.getSecurityManager() == null)
     {
        System.setSecurityManager ( new RMISecurityManager() );
     }

     CreditCardServer ccs = new CreditCardServer();

     int port = 1099;

     try {
        port = Integer.valueOf(args[0]);
        }
     catch (Exception e)
        {
        System.out.println("Invlaid Port");
        }

     if (((port <= 65535) && (port >= 49152)) || port ==1099)
     {
     System.out.println("Valid Port");
     }
     else
     {
         port = 1099;
        System.out.println("Port not in Dynamic Range 49152<-->65535");
     }

     System.out.println(port);

     LocateRegistry.createRegistry(port);

     LocateRegistry.getRegistry().bind("CreditCardServer", ccs);

     while (true)
     {
        //hum?
     }
}

}

スタック トレース

vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"

有効なポート

65000

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
        at java.security.AccessController.checkPermission(AccessController.java:553)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
        at java.net.Socket.connect(Socket.java:536)
        at java.net.Socket.connect(Socket.java:492)
        at java.net.Socket.<init>(Socket.java:389)
        at java.net.Socket.<init>(Socket.java:203)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
        at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
        at bookstorecreditcardserver.Main.main(Main.java:56)

私のポリシーファイル

grant {
// Allow everything for now
permission java.security.AllPermission;
};
4

3 に答える 3

30

私は一日中これに固執しており(コマンドラインから rmiregistry を開始する必要があることがわかった後)、Eclipse を使用してローカルでこれを機能させようとし、最終的に解決しました。他の人々をこの残酷な運命から救うためのヒント:

1 - コマンドライン フラグを使用して、ポリシー ファイルを正しく割り当てます。

java -Djava.security.policy=/home/.../<filename>.policy ...

または、これをコードに直接入れることによって:

System.setProperty("java.security.policy","file:///home/.../<filename>.policy");

プロジェクトのルートと同じフォルダーに配置することもできます)、URI を

file:./<filename>.policy

(絶対 URI ではなく相対 URI を使用してください - 私は実際にこれを今日まで理解していませんでした)。

2 - ポリシー ファイルの形式が正しいことを確認します。例:

grant codeBase "file:<path>/bin/-" {
    permission java.security.AllPermission;
};

これは、バイナリが配置されているフォルダーを参照する必要があります。ポリシー ファイルの形式の詳細な説明は、ここにあります。

それだけです。このチュートリアルもお勧めします。正しい軌道に乗るのに非常に役立ちました。

于 2012-04-14T22:33:15.817 に答える
3

基本的に、私は愚かです。Javaが.policyファイルAOKを見つけていると文句を言っていなかったので、.policyファイルの新しいコピーを作業ディレクトリに移動していなかったことがわかりました:-D

于 2010-03-11T18:24:19.367 に答える