首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMI UnmarshalException

RMI UnmarshalException
EN

Stack Overflow用户
提问于 2013-01-16 06:50:21
回答 1查看 873关注 0票数 2

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

代码语言:javascript
复制
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)

由于com.cs.entity.LectureCourse是一个应由客户端在运行时使用RMI代码基特性下载的类,因此我检查了以确保

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

当我在同一个节点上运行客户机和服务器时,当单独的物理机器分别保存服务器和客户端时,它会在客户端显示异常。

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

@EJP

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

代码语言:javascript
复制
        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)

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

代码语言:javascript
复制
    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服务器的同一段代码就会运行得很好。根据我在不同RMI服务器配置中的几个测试结果,我得出结论:

  1. Tomcat 7 contextInitialized方法做了与普通java主程序不同的事情。
  2. 我不确定,但只有当URL(我使用的是webserver)指示到特定的jar文件而不是目录时,代码库才能工作。(这可能是我对教程的误解或诸如此类)

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

EN

回答 1

Stack Overflow用户

发布于 2013-01-17 09:56:33

Tomcat 7 contextInitialized方法做了与普通java主程序不同的事情。

当然有了。但如果不知道你有什么具体的期望,就不可能再作进一步的评论了。

我不确定,但只有当URL(我使用的是webserver)指示到特定的jar文件而不是目录时,代码库才能工作。(这可能是我对教程的误解或诸如此类)

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

如果您期望RMI从目录中加载一个JAR文件,而不被专门告知,它就不会加载。如果您不给一个JAR文件命名,它将查找.class文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14352787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档