java.rmi.UnmarshalException:错误解组参数;嵌套异常是:java.lang.ClassNotFoundException:ServicesTableau

时间:2012-12-28 15:34:12

标签: java rmi

我需要你对JAVA RMI的帮助,我开发了一个用于排序表的示例程序。但我得到了这个例外:

Erreur RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: ServicesTableau

这是我的服务器源代码:

public class Serveur {
    public static void main(String args[]) {

        try {

            System.out.println("Server start ...");
            ServicesTableauImpl od = new ServicesTableauImpl();
            String url = "rmi://" + args[0] + "/ServicesTableauImpl";
            System.out.println("Passe");
            Naming.rebind(url, od);
            System.out.println("Attente d'invocations de client / CTRL-C pour stopper");
        } catch (Exception e) {
            System.out.println("Erreur " + e.getMessage());
        }
    /*
    catch(java.net.MalformatedURLException e){
    System.out.println("Mauvais nom de serveur");
    System.exit(1);
    }
    catch(RemoteException e){
    System.out.println("Pas de Rmiregistry");
    System.exit(1);
    }
    */
    }
}

6 个答案:

答案 0 :(得分:13)

该类在RMI注册表的CLASSPATH上不可用。最简单的解决方法是在同一个JVM中启动注册表,通过LocateRegistry.createRegistry().将结果存储在静态字段中。

答案 1 :(得分:0)

发生这种情况是因为我没有在与服务器相同的目录中运行rmiregistry

答案 2 :(得分:0)

我花了几个小时成功地启动了Orcale的简单示例表格!

希望可以帮助您

首先,我在Windows上运行该程序

我完全复制了here上的代码

但是我删除了软件包并将三个.class文件放在一起以说服

如果您对此不熟悉,我希望您也最好这样做

因为进入包裹,问题会更加复杂

要做三个步骤:

1.start rmiregistry

start rmiregistry -J-Djava.class.path=./

用于“远程接口定义”

以便rmiregistry可以找到该类

然后解决ClassNotFoundException

2。运行服务器

start java Server

然后您可以看到输出:

服务器就绪

3.run客户端

java Client

输出:

回应:您好,世界!

然后讨论如何处理包裹

通常是Server.class和interface.class ---“远程接口定义”

应放在同一包装中

您需要知道如何使用包运行.class

java {packagename}.Server

classpath的默认值为“ ./"

和包声明将有助于找到Server.class所需的interface.class

所以我们不需要单独设置-cp

顺便说一句,如果您尝试设置真实的类路径,则会收到错误消息

关于“启动rmiregistry”

它没有默认的类路径

所以我们需要设置

,它应该与类路径的默认值“ ./”相同。

答案 3 :(得分:0)

答案是基于 IDE 的项目。

您需要从构建文件夹中“启动 rmiregistry”。

例如: 在 Intellij

  1. 在“目标 -> 类”文件夹中打开终端
  2. 运行“启动 rmiregistry”
  3. 然后使用 intellij 运行您的服务器代码

对于 eclipse 我希望它的 build 文件夹

答案 4 :(得分:-1)

在某些情况下,您需要将rmi客户端代码(interface和main)移动到默认包。为服务器端重复它。它可以解决你的问题(rmi中的包装工作并不那么明显)。

答案 5 :(得分:-3)

此错误是因为没有编写安全管理器代码,因此无法加载类。 因此,请确保为安全管理器添加代码。
如果编译器找不到安全管理器,则创建一个新的。在main方法中添加代码。

if (System.getSecurityManager() == null) then
    System.setSecurityManager(new RMISecurityManager())