【问题标题】:Java RMI - ClassNotFound exceptionJava RMI - ClassNotFound 异常
【发布时间】:2012-10-13 17:54:54
【问题描述】:

我正在创建一个 Java RMI 程序,但我遇到了 ClassNotFoundException。 你们能帮我弄清楚吗?我正在使用 Eclipse。 有人建议我这是一个代码库问题,但这有什么关系? 以下是我的服务器和客户端的代码:

服务器:

    package server;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import base.Server;
import base.RmiStarter;

public class ServerImplStarter extends RmiStarter{

    public ServerImplStarter() {
        super(Server.class);
    }

    @Override
    public void doCustomRmiHandling() {
        try{
            Server engine = new ServerImpl();
            Server engineStub = (Server)UnicastRemoteObject.exportObject(engine, 0);


            Registry registry = LocateRegistry.createRegistry( 1099 );
            registry = LocateRegistry.getRegistry();
            registry.rebind("Server", engineStub);

        }catch(Exception e){
            e.printStackTrace();
        }

    }

    public static void main(String[] args){
        new ServerImplStarter();
    }

}

客户:

package client;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import base.RmiStarter;
import base.Server;
import base.Cell;

public class CellClient extends RmiStarter {

    public CellClient() {
        super(Server.class);
    }

    @Override
    public void doCustomRmiHandling() {
        try{
            Registry registry = LocateRegistry.getRegistry();
            Server server = (Server)registry.lookup("Server");

            Cell c = null;
            c = server.getcell();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new CellClient();
    }

}

错误是这样的:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: server.CellImpl
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at $Proxy0.getcell(Unknown Source)
    at client.CellClient.doCustomRmiHandling(CellClient.java:23)
    at base.RmiStarter.<init>(RmiStarter.java:19)
    at client.CellClient.<init>(CellClient.java:13)
    at client.CellClient.main(CellClient.java:31)
Caused by: java.lang.ClassNotFoundException: server.CellImpl
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
    at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
    ... 8 more

【问题讨论】:

标签: java rmi classnotfoundexception


【解决方案1】:

客户端和服务器应该有相同的包名。我昨天也遇到了同样的错误,经过大量搜索后我更正了。试试看,如果有任何其他错误出现,请告诉我。

如果您发现,请将其标记为答案。谢谢!

【讨论】:

  • 澄清一下,不同包中的两个相同的类是不同的,不一样的,一些RMI开发人员最初犯的错误是在包之间复制源代码,而不是在客户端和服务器JAR文件之间共享.class文件.但是,这里没有证据表明这是这里的实际问题。
  • 嗯...我试过了,但错误不断出现。但从现在开始,我将保持包名称相同。谢谢你的提示! (我的意思是,我尝试将包名称设置为相同)
  • 然后尝试在您的项目中添加策略文件,然后在服务器中添加使用安全管理器授予权限的代码,参考fragments.turtlemeat.com/rmi.php#secure。您必须在您的项目中添加编译代码,我为netbeans,不知道 eclipse "java -Djava.security.manager -Djava.security.policy=policy-file MyClass"
  • 为什么?服务器权限与客户端ClassNotFoundExceptions 无关。他不需要SecurityManager, 更不用说 .policy 文件,除非他试图使用代码库功能,而且也没有证据表明这一点。您引用的“教程”是非规范性的,并且包含几个错误。 @Rod 也忽略这个。
  • 实际上,我想做的是按照本教程进行操作:cs.put.poznan.pl/pawelw/… 我需要实现一个 Publish-Subscriber 示例,因此我可以将其应用于我的毕业项目(我是现在工作)。我在本教程的练习 2 中。任何帮助将不胜感激:) 谢谢!
【解决方案2】:

CellImpl 尚未通过客户端的 CLASSPATH 导出或提供。它需要 (a) 扩展 UnicastRemoteObject 或通过 UnicastRemoteObject.exportObject() 导出;或 (b) 可序列化并在客户端的 CLASSPATH 上可用。

【讨论】:

  • 嗯,我这里有: *一个扩展 java.io.Serializable 的接口 Cell *一个实现 Cell 的类 CellImpl *一个扩展 Remote 的接口 Server *一个实现服务器和的类 ServerImpl有一个返回 CellImpl 的方法 getcell() 所有这些都是服务器端的(接口也在客户端上)。那么,我必须做些什么才能在客户端获取这个 CellImpl?
  • @Rod 放入客户端的JAR文件中?
【解决方案3】:

运行 RMI 客户端时出现 NoClassFound 异常的解决方案。

案例:

服务器和客户端文件位于不同的文件夹中。

例子:

服务器端:服务器接口和服务器实现都在里面 项目文件夹:C:\RMIServer 包:rmiserver

客户端:服务器接口和客户端在里面 项目文件夹:C:\RMIClient 包:rmiClient

问题:找不到服务器接口的位置。

解决方案:在客户端, 1、创建包名rmiServer(包名要与服务器端包名相同)。 2. 将服务器存根放入此包中。 3. client.java 在 rmiClient 包内。现在在 client.java 文件中导入 rmiServer 包。 导入 rmiServer.*;

这将解决我们执行客户端RMI时发生的classNotFound Exception。

【讨论】:

  • 如果是这个原因会解决的;该信息已在六个月前声明here;还有很多其他原因。
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2016-05-29
相关资源
最近更新 更多