上周因为工作需要,写了一个 RMI 程序。程序在我自己的电脑(Windows 平台)上可以正常运行,但是当把程序提交到公司的 Linux 服务器上之后却出了意想不到的问题。
在命令行中启动 rmiregistry 之后,启动程序的服务器端,这时 JVM 提示:
java.rmi.UnmarshalException: Error unmarshaling return header: java.io.EOFException
从方法调用的堆栈输出的结果看来,程序运行到 Naming.rebind() 方法时就遇到了问题。之后我将相同的程序拷贝到其他 Windows 机器上就地编译,都没有出现问题。而公司所有的 Linux 服务器(都是安装的 RedHat EL 4,Java SE 5.0)上都出现相同的问题。最后不断排查,用 Google 搜索资料,在 SUN Technology Forum 上发现了这篇 post:“Basic RMI program works in windows but not Linux”。原来是 Linux 上安装的 gcc 也有 rmiregistry、rmic 的实现,而相应的环境变量又没有为此配置。使得在命令行下直接输入这两个命令,实际上调用的不是 Java 5 的相应程序,而是 gcc 的版本。