java - RMI 解码异常

标签 java rmi

当我编写 RMI 系统时,我在客户端遇到了异常问题

Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: com.cs.entity.LectureCourse
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
    at $Proxy1.getNamedClass(Unknown Source)
    at com.cs.test.ClientCRUD.main(ClientCRUD.java:40)

as com.cs.entity.LectureCourse 是一个应该由客户端在运行时使用 RMI 代码库功能下载的类,我已经检查过以确保

  1. 服务器 VM 参数的代码库设置正确并且
  2. 客户端 VM 选项 -Djava.security.policy= 也已正确设置。
  3. -Djava.rmi.server.hostname 还用于确保注册表正确获取内容

当我在同一节点运行客户端和服务器时,它可以工作,但当单独的物理机分别容纳服务器和客户端时,客户端会显示异常。

有人以前见过这个问题吗?请帮忙...

@EJP

以下是我用来启动 RMI 注册表的代码(在 tomcat 7 contextInitialized 内)

        final String value = "http://192.168.1.11:8080/csl/";
        System.out.println(value);
        System.setProperty("java.rmi.server.codebase", value);

        registry = LocateRegistry.createRegistry(8899)

这是我用来在客户端中查找注册表的代码

    System.setSecurityManager(new RMISecurityManager());

    final String HOST = "192.168.1.11";
    final int port = 8899;
    final Registry registry = LocateRegistry.getRegistry(HOST, port);

我认为它们工作正常,但错误让我很沮丧

我想我找到了问题所在。如前所述,RMI 注册表是在 Tomcat 7 contextInitialized 方法中启动的,该方法应在 Web 项目启动时调用。事实证明,如果 RMI 服务器的同一段代码位于独立的主应用程序中,则它可以很好地工作。根据我在不同 RMI 服务器配置中的多次测试,我得出的结论是

  1. Tomcat 7 contextInitialized 方法执行的操作与普通 java 主程序不同
  2. 我不确定,但代码库似乎只有在 URL(我正在使用网络服务器)指示特定 jar 文件而不是目录时才有效。 (这可能是我对教程的误解或类似的事情)

所以问题是为什么 Tomcat 7 没有以不同的方式启动 RMI 注册表?我仍在努力

最佳答案

Tomcat 7 contextInitialized method does something different then ordinary java main program

当然可以。但在不知道您有什么具体期望的情况下,无法进一步发表评论。

I am not sure but codebase seems work only if the URL(I am using webserver) indicates to a specific jar file rather then directory. (this could be my misunderstanding of the tutorial or something like that)

它的效果要好得多,因为只需下载一次,而且您不必将 .class 文件散布在代码库服务器上:只需部署一个或多个 JAR 文件即可。

如果您期望 RMI 从目录加载 JAR 文件,而没有明确告知您这样做,那么它不会。如果您没有命名 JAR 文件,它将查找 .class 文件。

关于java - RMI 解码异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14352787/

相关文章:

java - JAXB :Class cast exception while trying to unmarshall XML using JAXB

java - 通过容器 session 管理在 Java 中使用 POJO RPC 比 JBoss 更简单

java - Asm api 版本定义中的按位 OR 运算符

java - JPanel 中的 JLabels,在运行时新标签包含以前的标签

java - 在 OneToMany 中使用 Hibernate 持久保存对象

java - 进口声明澄清

java - 为什么接口(interface)对于创建 RMI 应用程序很重要?

java - 通过 RMI 保持相同的线程名称

java - Raspberry Pi 上的 RMI 不起作用连接拒绝主机 : 127. 0.0.1