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

Posted

技术标签:

【中文标题】java.rmi.UnmarshalException:解组参数错误;嵌套异常是:java.lang.ClassNotFoundException: ServicesTableau【英文标题】:java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: ServicesTableau 【发布时间】:2012-12-13 20:37:01 【问题描述】:

我需要您在 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);
    
    */
    

【问题讨论】:

这个类 ServicesTableauImpl 在类路径中可用吗? @PradeepSimha 缺少的类是ServicesTableau,而不是ServicesTableauImpl。阅读异常。 【参考方案1】:

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

【讨论】:

我在 Linux 下工作,感谢您的回复(我使用 rmiregistry 现在可以正常工作了) Linux 对答案没有任何影响。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

希望能帮到你

首先,我在 Windows 上运行程序

我完全从here复制代码

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

如果你不熟悉这个,我希望你也这样做

因为当包裹进来时,问题会更复杂

需要做三个步骤:

1.启动rmiregistry

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

用于“远程接口定义”

以便 rmiregistry 可以找到类

然后解决ClassNotFoundException

2.运行服务器

start java Server

然后就可以看到输出了:

服务器准备就绪

3.运行客户端

java Client

输出:

响应:你好,世界!

那就说说怎么处理包

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

应该在同一个包中

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

java packagename.Server

类路径默认为“./”

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

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

顺便说一句,如果你尝试设置真正的类路径,你会得到错误

至于“启动rmiregistry”

它没有默认的类路径

所以我们需要设置它

并且应该和classpath的默认值“./”一样

【讨论】:

由于类路径默认为.,正如您正确指出的那样,明确指定它不可能成为解决方案的一部分。服务器类和远程接口不需要在同一个包中。答案只是华夫饼。【参考方案4】:

在某些情况下,您需要将 rmi 客户端代码(接口和主代码)移动到默认包。在服务器端重复它。它可以解决您的问题(在 rmi 中使用打包并不那么明显)。

【讨论】:

自 Java 1.4 以来,使用默认包甚至无法正常工作。您当然必须在客户端和服务器上使用 same 包,即严格来说相同的 class,但它不应该是默认包。【参考方案5】:

答案是基于 IDE 的项目。

您需要从 build 文件夹中“start rmiregistry”。

例如: 在 Intellij

    在“target -> classes”文件夹中打开终端 运行“启动 rmiregistry” 然后使用 intellij 运行您的服务器代码

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

【讨论】:

你的意思是说“这个答案是针对基于 IDE 的项目的吗?”;如果不是,你指的是哪个答案? 毫无意义的回答。这在应用程序部署的地方不起作用。【参考方案6】:

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

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

【讨论】:

不,不是。这是由于找不到类。您需要阅读整个异常。如果他正在使用 RMI 代码库功能,这只是由于缺乏安全经理,这没有说明。

以上是关于java.rmi.UnmarshalException:解组参数错误;嵌套异常是:java.lang.ClassNotFoundException: ServicesTableau的主要内容,如果未能解决你的问题,请参考以下文章