1

甲骨文说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());
    }
}

和人类:

public class Person implements Remote, Serializable {
    String name;
    public Person(String name) { this.name = name; }
    public String getName() { return name; }
}

rmiregistryrmiregistry &. 然而,当我运行代码时,它抱怨在执行时无法解组参数,bind因为Person找不到类。

我知道rmiregistry找不到类文件,但我不明白为什么。这是告诉它在哪里可以找到要绑定的类的正确方法吗?

4

1 回答 1

0

虽然我无法发现您的程序的问题(我已经复制了它并得到了相同的错误),但我可以建议您在启动 rmiregistry 之前在同一进程中设置一个显式的 CLASSPATH 环境变量。该类路径必须与 RMI 服务器进程中的相同。例子:

set CLASSPATH=my_class_directory:my_jar1:my_jar2...
rmiregistry &

根据Oracle 文档,我承认这不是一个好习惯,它告诉我CLASSPATH要从 rmiregistry中删除。但是,由于您是从本地主机获取代码,所以总比不让它工作好。

于 2016-08-26T22:18:19.360 回答