因此,我花了很长时间试图从其他人在RMI教程中遇到问题找到答案,但我完全无法理解这一点。我正在通过eclipse来完成这个教程。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
在Eclipse我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 2012-04-21 08:49:47
您的政策文件可能不会被引用。你只提到文件名,而不是完整的路径。因此,文件是否会被引用将取决于您如何以及从何处启动程序。您可以根本不指定策略,以便JVM引用缺省策略文件或提及文件的完整路径。 – Drona 2012-04-22 05:00:20