Oracle说registry
是
一个引导命名服务,由同一主机上的RMI服务器使用,将远程对象绑定到名称
现在,我有这样一个服务器,使用rmiregistry
提供JNDI
。
public class ObjectProvider {
public static void main(String[] args) {
System.setProperty("java.rmi.server.codebase", "file:/absolute/path/to/jar/where/person/class/is/my.jar");
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
Context context = new InitialContext(env);
context.bind("jordan", new Person("Michael Jordan"));
Person p = (Person) context.lookup("jordan");
System.out.println("jordan = " + p.getName());
}
}
和Person类:
public class Person implements Remote, Serializable {
String name;
public Person(String name) { this.name = name; }
public String getName() { return name; }
}
, rmiregistry
作为rmiregistry &
启动。然而,当我运行代码时,它抱怨无法在执行bind
时解组参数,因为找不到类Person
。
我明白rmiregistry
找不到类文件,但我不明白为什么。这是告诉它在哪里可以找到要绑定的类的正确方法吗?
虽然我无法发现您的程序的问题(我已经复制了它并得到了相同的错误),但我可以建议您在启动rmiregistry之前在同一进程中设置一个显式的CLASSPATH环境变量。这个类路径必须与RMI服务器进程中的类路径相同。例子:
set CLASSPATH=my_class_directory:my_jar1:my_jar2...
rmiregistry &
我承认根据Oracle文档这不是一个好的做法,它告诉从rmiregistry中删除CLASSPATH
。但是,由于您正在从本地主机获取代码,因此总比不让它工作要好。