Rod
Rod

Reputation: 464

Java RMI - ClassNotFound exception

I'm creating a Java RMI program, but I'm getting a ClassNotFoundException. Could you guys help me figure it out? I'm using Eclipse. Somebody suggested me it was a codebase problem, but how does this relate? Here are the codes for my Server and Client:

Server:

    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();
    }

}

Client:

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();
    }

}

and the error is this:

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

Upvotes: 4

Views: 12023

Answers (3)

samsad beagum
samsad beagum

Reputation: 181

Solution for NoClassFound Exception when running RMI Client.

Case:

The server and client files are in different folders.

Example:

Server side: The server interface and server implementation are inside Project Folder: C:\RMIServer Package: rmiserver

Client side: The server interface and the client are inside Project Folder: C:\RMIClient Package: rmiClient

Problem: Could not find the location of the server interface.

Solution: In the client side, 1. Create a package name rmiServer (the package name should be the same as the server side package). 2. Place the server stub inside this package. 3. The client.java is inside the rmiClient package. Now import the rmiServer package in the client.java file. import rmiServer.*;

This will solve the classNotFound Exception that happens when we execute the client side RMI.

Upvotes: -2

akshaykumar6
akshaykumar6

Reputation: 2257

Both client and server should have same package name. I had the same error yesterday, i corrected it after lots of searching. Try it and tell me if any other error comes.

Mark this as answer, if you find so.Thank You !!

Upvotes: 2

user207421
user207421

Reputation: 311021

CellImpl has not been exported or made available via the client's CLASSPATH. It needs to either (a) extend UnicastRemoteObject or be exported via UnicastRemoteObject.exportObject(); or (b) be Serializable and available on the client's CLASSPATH.

Upvotes: 1

Related Questions