RMI启动服务出现Stub这个ClassNotFound的解决

今天一个项目要使用RMI,于是开始写了一个小示例运行一下。
1. 写接口继承Remote,并给出要实现的方法
2. 写一个方法继承UnicastRemoteObject,并实现上面的接口
3. 写Server,进行Naming.rebind
4. 运行rmic(在JDK的bin目录,而不是在JDK\jre\bin目录下)生成Stub。
这中间有一个小麻烦,举例来说如果第2步中的类名是TestObj,放在com.test包中。
那么典型的目录结构是WEB-INF\classes\com\test目录下有一个TestObj.class
这时候需要在WEB-INF\classes目录下运行命令 rmic com.test.TestObj
注意:如何运行的路径和方式不正确的话, 会出现找不到TestObj.class的错误.
5. 写Client端代码,Naming.lookup. 然后调用远程方法。
6. 运行start rmiregistry
7. java com.test.TestObjServer, 这时候出问题了,总是报告说找不到TestObj_Stub.class,奇怪啊,这个Class明明很安静地躺在目录下啊?
经过一番查找,最后目标锁定在java的版本上,因为机器安装了Oracle,而Oracle自带了JDK,而且版本较低,在环境变量中调换了JDK使用的顺序,重新运行命令。
成功了!
8. 生成policy.txt
9. java -Djava.security.policy=policy.txt TestObjClient
得到正确结果!

注意点:
启动server时如果遇到找不到stub问题,原因是rmiregistry找不到stub,而不是java com.Server找不到stub,解决方法,在stub的类同一个目录下启动rmiregistry.

你可能感兴趣的:(RMI启动服务出现Stub这个ClassNotFound的解决)