RMIチュートリアルで問題を抱えている他の人からの回答を探し出すのにかなり時間を費やしましたが、私はこれを完全に打ち砕いています。私はeclipseを通じてこのチュートリアルをやっています。ComputeEngineでのRMIチュートリアルのエラー
My ComputeEngineクラス。これはチュートリアルからコピーされたものなので、何か問題はないとは思わない。
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import compute.Compute;
import compute.Task;
public class ComputeEngine implements Compute {
public ComputeEngine() {
super();
}
public <T> T executeTask(Task<T> t) {
return t.execute();
}
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
String name = "Compute";
Compute engine = new ComputeEngine();
Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngine exception:");
e.printStackTrace();
}
}
}
は私がして、コマンドラインでのrmiregistryを開始
set classpath=
start rmiregistry
日食で
私のVMの引数は次のとおりです。
-Djava.rmi.server.codebase=file:/C:/Users/Kevin/workspace/RMI/bin/
-Djava.rmi.server.hostname=Compute
-Djava.security.policy=server.policy
私はcompute.jarファイルとのserver.policyを持っていますbinフォルダ内のファイル。私はポリシーファイルのすべての権限を与えました。すべてのその後
grant{
permission java.security.AllPermission;
};
、私はComputeEngineを実行すると、次のエラーを取得:
ComputeEngine exception:
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at engine.ComputeEngine.main(ComputeEngine.java:31)
それが再バインドでの問題のいくつかの種類を持っているように思えるが、私は何を理解していません。また、ポリシーファイルがあるときにAccessControlExceptionを理解できません。私はrmiregistryがまだ実行中であることを確認するためにチェックし、私はそれを起動した後に来る空のウィンドウを閉じることはありません。
だから、私は失われています。
AllPermissionを指定すると、彼の「セキュリティ仕様」だけでどのように問題になることがありますか? – EJP
ポリシーファイルがまったく参照されないことがあります。完全なパスではなく、ファイル名のみを記述します。したがって、ファイルが参照されるかどうかは、プログラムの起動方法と場所によって大きく異なります。 JVMがデフォルトのポリシーファイルを参照するように、またはファイルへの完全なパスを記述するように、ポリシーをまったく指定しないでください。 – Drona