java - 如何告诉 rmiregistry 在哪里寻找类(class)?

标签 java rmi rmiregistry

Oracle says 注册表

a bootstrap naming service that is used by RMI servers on the same host to bind remote objects to names

现在,我有这样一个服务器,它使用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找不到类文件,但我不明白为什么。这是告诉它在哪里可以找到要绑定(bind)的类的正确方法吗?

最佳答案

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

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

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

关于java - 如何告诉 rmiregistry 在哪里寻找类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39169016/

相关文章:

java - 如何设置转换为字母的符号列表?

java - 用户名、密码等硬编码到程序中——如何从文件中获取它们?

spring - Spring RMI 出现错误

java - 反射访问控制异常

java - RMI 服务器 : rmiregistry or LocateRegistry. 创建注册表

java - 这段代码到 OpenCV Java 的翻译是什么?

java - 如何对 SWT 列进行降序排序

java - 如何使用 Eclipse 在 Windows 上通过 RMI 命令运行 Java SE 6

java - 详细 rmiregistry - 如何跟踪 rmiregistry 状态?

RMI 绑定(bind)问题(从 Windows RMI 服务器到 Ubuntu RMI 注册表)