异常一:
java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
java.lang.ClassNotFoundException: RMITest.RemoteIMP_Stub
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396
)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
.......................
解决:
在执行 start rmiregistry 命令前必须确保 RMITest.RemoteIMP_Stub.class(注意包名) 包含在了 CLASSPATH 配置的路径中
在执行 start rmiregistry 命令前执行 set CLASSPATH=%CLASSPATH%;D:\J2EETest\testjava\src\;
异常二
1> 起初启动 rmiregistry 时报告Warning;
C:\> rmigistry
Warning: JIT compiler "symcjit" not found. Will use interpreter.
原因:
因为用Ghost还原系统后忘记了将JDK的bin路径设置到系统path环境变量中, 故找不到所需程序而发出警告.
其实在这里使用的是Oracle的 rmiregistry.exe 程序, 在以下的问题中你会发现其他与 rmiregistry.exe 相关
的错误.
解决:
将JDK的bin目录添加到 系统 path 变量中
2> 启动服务器端时报告错误:
错误一:
C:\serv> java -Djava.security.policy=file:.\RMIpolicy1.policy -Djava.rmi.server.codebase=file:.\ UpperImpl
Result errors is:
java.rmi.ServerException: Server RemoteException; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested excepti
on is:
......
原因:
Oracle9i把自己的bin路径添加到了系统path的最前端, 因而可以找到 Oracle 的 rmiregistry.exe,
而不是JDK的 rmiregistry.exe; 因而会执行错误,它和JDK的比较如下:
oracle的rmiregistry,大小为:6144字节
jdk1.4的rmiregistry,大小为:28775 字节
解决:
将所有与 Oracle 相关的 path 变量 移动到 path 变量的末尾, 将 JDK的bin路径移动到 path 变量的最前端
(警告: 未测试这样作对 Oracle 系统会带来什么样的影响)
错误二:
C:\serv> java -Djava.security.policy=file:.\RMIpolicy1.policy -Djava.rmi.server.codebase=file:.\ UpperImpl
RMIserver erroraccess denied (java.net.SocketPermission 127.0.0.1:1099 conne
esolve)
java.security.AccessControlException: access denied (java.net.SocketPermissi
27.0.0.1:1099 connect,resolve)
......
原因:
没有设置 classpath, 且文件 RMIpolicy1.policy 的内容不对
原内容为:
grant{
permission java.security.ALLPermission;
}
这样并不使我得程序运行成功
解决:
更改 RMIpolicy1.policy 内容为:
grant {
permission java.net.SocketPermission "*:1024-65535", "accept,connect,listen,resolve"; //(1.1)
permission java.net.SocketPermission "*:80", "accept,connect,listen,resolve"; //(1.2)
permission java.security.ALLPermission;
};
或者配置你的$JRE_PATH/lib/security/java.policy
其中加入如下两行:
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
permission java.net.SocketPermission "*:80", "connect";
(如果你按照第二种方法改动的话, 恐怕不会遇到下面的错误, 仅仅是猜测而已)
3> 启动客户机时有错误:
C:\client> java UpperClient
RMI exception : access denied (java.net.SocketPermission 127.0.0.1:1099 connect,
resolve)
java.security.AccessControlException: access denied (java.net.SocketPermission 1
27.0.0.1:1099 connect,resolve)
....
原因:
UpperClient.class并不是 applet , 而是 application, 又因为 RMI 有安全限制, 所以需要在客户端
使用 policy 策略文件.
解决:
将服务器目录下的 RMIpolicy1.policy 文件拷贝到 客户端目录并使用如下命令:
C:\client> java -Djava.security.policy=file:.\RMIpolicy1.policy UpperClient
[email protected]
2006-5-16
资料参考:
http://www.itpub.net/142217.html
配置你的$JRE_PATH/lib/security/java.policy
其中加入如下两行:
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
permission java.net.SocketPermission "*:80", "connect";
然后你再试试看,ok?
http://202.102.240.73/java/javaweb/linuxjava/cjdk1_2-doc-zh/jdk1.2/zh/docs/guide/rmi/getstart.doc.html
注册服务程序的缺省运行端口为 1099。要在其它端口上启动注册服务程序,可利用命令行指定端口号。
例如,要在 Windows NT 系统上从端口 2001 启动注册服务程序:
start rmiregistry 2001
如果注册服务程序是在缺省端口以外的端口运行,则需要在名称中指定端口号。当调用注册服务程序时,
该名称将传给 java.rmi.Naming 类基于 URL 的方法。例如在 Hello World 示例中,如果注册服务
程序在端口 2001 上运行,则将 HelloServer 的 URL 绑定到远程对象引用所需的调用为:
Naming.rebind("//myhost:2001/HelloServer", obj);
http://ehot.blogdriver.com/ehot/455591.html
因为rmi有安全限制,所以在客户端必须建立一个策略文件
http://www.javaworld.com.tw/jute/post/print?bid=5&id=23374