저는 RMI 자습서에 문제가있는 다른 사람들의 답을 찾기 위해 꽤 오래 동안 노력했지만이 문제에 완전히 몰두했습니다. 나는 이클립스를 통해이 튜토리얼을하고있다.ComputeEngine의 RMI 자습서 오류
내 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