首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMI ClassNotFoundException

RMI ClassNotFoundException
EN

Stack Overflow用户
提问于 2009-07-04 07:07:21
回答 1查看 4K关注 0票数 0

在试图撤消Netbeans 6.5/windows中的远程方法时,在RMI中遇到UnmarshalException ClassNotFoundException。rmi客户端和服务器程序都运行在同一台机器上。

RMI客户程序:

源代码定位

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

类文件位置

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

构建JAR文件位置

  • F:\NewRMIClient\dist\NewRMIClient.jar

RemoteInterface.java

包装消毒剂;

进口java.rmi.Remote;进口java.rmi.RemoteException;

公共接口RemoteInterface扩展远程{ void sendMessageFilePath(String messagePath)抛出RemoteException;}

RMIClient.java

代码语言:javascript
复制
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服务器程序:

源代码定位

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

类文件位置

  • 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

建罐位置

  • F:\RMIProj\dist\RMIProj.jar

RemoteInterface.java

代码语言:javascript
复制
 package rmiproj;

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

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

RmiServer.java

代码语言:javascript
复制
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();
     }
}

策略文件的位置: F:\PolicyFiles\rules.policy

rules.policy授予{ java.security.AllPermission;};

当试图从客户端调用远程方法时,将在控制台上引发以下异常:

代码语言:javascript
复制
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)

请帮我解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2009-07-04 07:38:49

您需要在客户端JVM中使用rmiproj.RemoteInterface类。尝试将rmiproj.RemoteInterface包含在NewRMIClient.jar中(或者在客户端的类路径中包含另一个JAR )。

还请注意,您正在调用的远程对象实现的是rmiproj.RemoteInterface,而不是newrmiclient.RemoteInterface。这意味着,即使在客户机JAR中使用rmiproj.RemoteInterface,在代码开始工作之前,您还需要对代码做一些工作。rmiServer需要类型为rmiproj.RemoteInterface

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1081712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档