2014-09-28 105 views
0

我试图运行Oracle网站http://docs.oracle.com/javase/tutorial/rmi/running.html中给出的RMI应用程序的示例。 但是,尝试Eclipse和在命令行中,我无法运行服务器或客户端。 事实上,在Eclipse中运行时,我得到这个错误:运行示例RMI应用程序

ComputeEngine exception: 
java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve") 

我也已经改变了VM参数是这样的:

  • 对于COMPUTEENGINE(服务器):

    -Djava .security.manager -Djava.rmi.server.codebase = file:/Users/name/Documents/workspace/PiComputationRM/src/compute/compute.jar -Djava.security.policy =/Users/name/Documents/workspace/PiComputationRM /server.policy

  • 对于ComputePi(客户端):

    -Djava.security.policy = /用户/名/文件/工作区/ PiComputationRM/client.policy

我的客户端和服务器策略的内容是:

grant { 
permission java.security.AllPermission; 
}; 

此外,当我尝试在终端与运行服务器:

java -Djava.security.policy="server.policy" src/engine/ComputeEngine.java 

我得到这个错误:

Error: Could not find or load main class src.engine.ComputeEngine.java 

请任何帮助,我已经花了徒劳互联网上的许多个小时?

+0

参见下面的问题已经问: http://stackoverflow.com/questions/2427473/java-rmi-accesscontrolexception-access-denied – mbsingh 2014-09-28 22:45:50

回答

0
ComputeEngine exception: 
java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve") 

您正在使用安全管理器,但您尚未在.policy文件中授予该权限。

I also have changed the VM Argument like this:

For the ComputeEngine (server):

-Djava.security.manager -Djava.rmi.server.codebase=file:/Users/name/Documents/workspace/PiComputationRM/src/compute/compute.jar -Djava.security.policy=/Users/name/Documents/workspace/PiComputationRM/server.policy 

几个问题有:

  • 文件:代码库是行不通的,除非它指定一个共享的位置,是该名称在客户端和注册表可见。这看起来不像其中之一。

  • 你需要检查是否是策略文件

  • 你甚至不需要在服务器安全管理器或政策,除非客户在设置自己的代码库,并会正确的名称为你提供课程。这在这个例子中不会发生。

For the ComputePi (client):

-Djava.security.policy=/Users/name/Documents/workspace/PiComputationRM/client.policy 

仔细检查了这个名字。

Also when I try to run the server in terminal with:

java -Djava.security.policy="server.policy" src/engine/ComputeEngine.java 

I got this error:

Error: Could not find or load main class src.engine.ComputeEngine.java 

当然,你做到了。你给了JVM一个编译器命令。使用教程中提供的命令。您不会将.java文件命名为JVM。

I have spent many hours on the Internet in vain

您应该根据教程重新检查您的工作。您至少在两个地方误解了本教程。

我也会质疑你是否真的需要代码库功能。我会首先将它和安全管理人员彻底清除,然后让他们在没有他们的情况下工作。对于第一个RMI项目来说,这太复杂了。

+0

我不明白,当你说,我还没有批准安全管理器的权限。我做了这个授权{permission} java.security.AllPermission; };够了?不是吗? – Othmane 2014-09-28 23:37:45

+0

只有在实际加载该文件时才足够。这就是为什么我说要仔细检查文件名,这就是关于java.security.debug = access的建议,在其他地方看到的失败都是关于它的。它告诉你当你遇到问题时你在什么安全域,以及它有什么权限,这反过来告诉你文件是否正确加载。很显然你的情况并非如此。 – EJP 2014-09-28 23:46:45

+0

NB你说过[这里](http://stackoverflow.com/questions/26090326/running-a-sample-rmi-application/26090748#26090748)你已经用java.security.debug试过了,所以你应该已经有这个输出来检查。您应该将相关部分编辑到您的问题中。 – EJP 2014-09-28 23:53:53