RMI服务器无法启动:Eclipse Neon构建火灾报警系统遇导出异常
解决RMI启动时的"object already exported"错误
这个ExportException: object already exported错误我碰到过不少次,本质原因就是同一个RMI远程对象被重复尝试导出到网络端口,或者旧的Server进程没彻底关闭、端口被占用导致的。给你几个针对性的解决步骤:
先清理残留的Server进程
很多时候是Eclipse里之前启动的Server进程没真正关掉,还占着端口和对象引用。你可以:- 切换到Eclipse的
Console视图,找到之前启动Server的控制台,点击右上角的红色终止按钮(Stop)彻底关掉它; - 如果还是不行,打开系统的任务管理器(Windows)或者活动监视器(Mac),找到所有
java.exe或java进程,关掉和你的项目相关的那些。
- 切换到Eclipse的
检查代码里的重复导出操作
如果你的远程对象继承了UnicastRemoteObject,它的构造函数默认会自动完成对象导出,这时候手动再调用UnicastRemoteObject.exportObject()就会触发重复导出错误。比如下面的错误写法:// 错误示例:继承UnicastRemoteObject后重复导出 public class FireAlarmServer extends UnicastRemoteObject implements FireAlarmService { public FireAlarmServer() throws RemoteException { super(); // 这里多余了!UnicastRemoteObject的构造已经导出了对象 UnicastRemoteObject.exportObject(this, 1099); } }修正方法:要么去掉手动的
exportObject调用,要么如果不需要继承UnicastRemoteObject,就确保只调用一次exportObject方法。重启rmiregistry服务
rmiregistry有时候会缓存旧的对象引用,导致新进程启动时冲突。你可以:- 关掉当前运行rmiregistry的命令行窗口;
- 重新打开一个命令行窗口,切换到你的项目编译后的类文件所在目录(比如
bin目录); - 重新执行
rmiregistry命令(如果需要指定端口,用rmiregistry 1099)。
检查Eclipse的运行配置
打开Eclipse的Run > Run Configurations,找到你的Server运行项:- 取消勾选
Allow multiple instances选项,避免不小心启动多个Server进程; - 确认
Arguments里的VM参数没有重复设置RMI相关的端口配置。
- 取消勾选
内容的提问来源于stack exchange,提问作者Ravindu Dharmasena
相关产品推荐
相关产品推荐

