简体   繁体   中英

RMI ClassNotFoundException

Encountering UnmarshalException ClassNotFoundException in RMI while attempting to revoke Remote Method in Netbeans 6.5/windows xp. Both rmi client and server programs are running in the same machine.

RMI Client Program:

Source Code Location

  • F:\\NewRMIClient\\src\\newrmiclient\\RMIClient.java

  • F:\\NewRMIClient\\src\\newrmiclient\\RemoteInterface.java

Class Files Location

  • F:\\NewRMIClient\\build\\classes\\newrmiclient\\RemoteInterface.class

  • F:\\NewRMIClient\\build\\classes\\newrmiclient\\RMIClient.class

Built JAR File Location

  • F:\\NewRMIClient\\dist\\NewRMIClient.jar

    RemoteInterface.java

    package newrmiclient;

    import java.rmi.Remote; import java.rmi.RemoteException;

    public interface RemoteInterface extends Remote { void sendMessageFilePath(String messagePath) throws RemoteException; }

RMIClient.java

package newrmiclient;

import java.rmi.*;
import java.rmi.registry.*;

public class RMIClient
{
    static public void main(String args[])
    {
       RemoteInterface rmiServer;
       Registry registry;
       String serverAddress="192.169.4.11";
       String serverPort="3232";
       String text="hello";
       System.out.println("sending "+text+" to "+serverAddress+":"+serverPort);

        System.setProperty("java.security.policy","file:/F:/PolicyFiles/rules.policy");

        if(System.getSecurityManager() == null)
        {
           System.setSecurityManager(new RMISecurityManager());
        }

       try{
           // get the “registry”
           registry=LocateRegistry.getRegistry(serverAddress,(new Integer(serverPort)).intValue());
           // look up the remote object
           rmiServer=(RemoteInterface)(registry.lookup("MessagePath"));
           // call the remote method
           rmiServer.sendMessageFilePath(text);
       }
       catch(RemoteException e){
           e.printStackTrace();
       }
       catch(NotBoundException e){
           e.printStackTrace();
       }
    }
}

RMI Server Program:

Source Code Location

  • F:\\RMIProj\\src\\rmiproj\\RemoteInterface.java

  • F:\\RMIProj\\src\\rmiproj\\RmiServer.java

Class Files Location

  • F:\\RMIProj\\build\\classes\\rmiproj\\RemoteInterface.class

  • F:\\RMIProj\\build\\classes\\rmiproj\\RmiServer.class

  • F:\\RMIProj\\build\\classes\\rmiproj\\RmiServer_Skel.class

  • F:\\RMIProj\\build\\classes\\rmiproj\\RmiServer_Stub.class

Built JAR Location

  • F:\\RMIProj\\dist\\RMIProj.jar

RemoteInterface.java

 package rmiproj;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RemoteInterface extends Remote
{
    void sendMessageFilePath(String messagePath) throws RemoteException;
}

RmiServer.java

package rmiproj;

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

public class RmiServer extends UnicastRemoteObject implements RemoteInterface
{
    int      thisPort = 3232;

    Registry registry;    // rmi registry for lookup the remote objects.

    public RmiServer() throws RemoteException
    {
        try
        {
            System.setProperty("java.rmi.server.codebase","file:/F:/RMIProj/");
            System.setProperty("java.rmi.server.hostname","RMIServer");
            System.setProperty("java.security.policy","file:/F:/PolicyFiles/rules.policy");

            if(System.getSecurityManager() == null)
            {
                System.setSecurityManager(new RMISecurityManager());
            }

            // create the registry and bind the name and object.
            registry = LocateRegistry.createRegistry( thisPort );
            registry.rebind("MessagePath", this);
        }
        catch(RemoteException re)
        {
            re.printStackTrace();
        }
    }

    // This method is called from the remote client by the RMI.
    // This is the implementation of the “RemoteInterface”.
    public void sendMessageFilePath(String messageFilePath) throws RemoteException
    {
        System.out.println(messageFilePath);
    }

    public static void main(String args[]) throws RemoteException
    {
         RmiServer s=new RmiServer();
     }
}

Location of the policy file: F:\\PolicyFiles\\rules.policy

rules.policy grant { permission java.security.AllPermission; };

When attempting to invoke remote method from client, following exception is thrown on console:

sending hello to 192.169.4.11:3232
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
        java.lang.ClassNotFoundException: rmiproj.RemoteInterface
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at newrmiclient.RMIClient.main(RMIClient.java:28)
Caused by: java.lang.ClassNotFoundException: rmiproj.RemoteInterface
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)
        at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)
        at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)
        at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
        at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)

Please help me to resolve this issue.

You need to have the rmiproj.RemoteInterface class available in your client JVM. Try including rmiproj.RemoteInterface in NewRMIClient.jar (or another JAR included in your client's classpath).

Note also that the remote Object you are calling implements rmiproj.RemoteInterface and NOT newrmiclient.RemoteInterface . This means that you have some work to do on your code before it is going to work even with rmiproj.RemoteInterface in the client JAR. rmiServer needs to be of type rmiproj.RemoteInterface .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM