java - RMI ClassNotFoundException : java. RMI.server.RemoteObjectInitationHandler 仅适用于 java 1.4.2 客户端

标签 java rmi

我正在开发 Java RMI 应用程序。

对于使用 java 7 的客户端,一切正常运行。

但是对于使用java 1.4.2的客户端。

服务器在带有 java 7 的 Windows XP 上运行。

服务接口(interface):

package rmiserver;
import java.rmi.*;

public interface ServiceInterface extends Remote {

    public static final int port=1099; 
    public String getString(Integer n) throws RemoteException;

}

服务实现:

package rmiserver;
import java.rmi.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;



public class ServiceImplementation extends UnicastRemoteObject implements ServiceInterface{


    public ServiceImplementation() throws RemoteException {
        try {
        } catch (Exception e) {
            System.out.println("Error:" + e.toString());
        }
    }

    public String getString(Integer n) throws RemoteException {        
        return n.toString();        
    }

    public static void main(String[] args) { // Por ej. en el main del servidor RMI
        int port = ServiceInterface.port;
        System.setSecurityManager(new RMISecurityManager());
        try {
            java.rmi.registry.LocateRegistry.createRegistry(port);
        } catch (Exception e) {
            System.out.println(e.toString() + "Rmiregistry OK.");
        }
        try {
            ServiceImplementation service = new ServiceImplementation();
            String machine = "//192.168.1.3" + ":" + port;
            String name_service = "/serviceString";
            String serviceRemoto = machine + name_service;
            Naming.rebind(serviceRemoto, service);
            System.out.println("....OK.....");
        } catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
    }


}

客户:

package rmiclient;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import rmiserver.ServiceInterface;

public class RMIClient {


    public static void main(String[] args) {
        try {
            ServiceInterface service;
            String name_service = "/serviceString";
            System.setSecurityManager(new RMISecurityManager());
            int port = ServiceInterface.port;
            String machine = "192.168.1.3";
            service = (ServiceInterface) Naming.lookup("rmi://" + machine + ":" +port + name_service);
            System.out.println("OUTPUT: "+service.getString(new Integer(23)));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

在客户端和服务器上我有以下 java.policy:

grant {
permission java.security.AllPermission;
};

在服务器端,我有“Service”文件夹,在该文件夹下我有:

  1. RmiServer.jar
  2. java.policy
  3. RmiServer.bat(我用它运行服务)

RmiServer.bat:

java -classpath RmiServer.jar -Djava.rmi.server.codebase=file:RmiServer.jar -Djava.security.policy=java.policy -jar RmiServer.jar

在客户端,我有“Client”文件夹,在该文件夹下我有:

  1. RMIClient.jar
  2. java.policy
  3. stub_folder/rmiserver/(它是包含 ServiceImplementation_Stub.class 的文件夹)
  4. lib/(包含 RmiServer.jar 的文件夹)
  5. RMIClient.bat(我用它运行客户端)

RMIClient.bat:

java -classpath lib -Djava.rmi.server.codebase=file:lib -Djava.security.policy=java.policy -jar RMIClient.jar 

我生成的 stub 如下:

rmic -classpath RmiServer.jar -d stub_folder rmiserver.ServiceImplementation

在 java 1.4.2 中运行客户端时出现以下错误:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.lang.ClassNotFoundException: java.rmi.server.RemoteObjectInvocation
Handler
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Unknown Source)
        at rmiclient.RMIClient.main(RMIClient.java:17)
Caused by: java.lang.ClassNotFoundException: java.rmi.server.RemoteObjectInvocat
ionHandler
        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.ClassLoader.loadClassInternal(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.defaultReadFields(Unknown Source)
        at java.io.ObjectInputStream.readSerialData(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        ... 3 more

感谢您的帮助。

最佳答案

您正在运行一个没有 stub 的 1.5+ 服务器,这会导致使用动态 stub (以动态代理和 RemoteObjectInitationHandler 的形式),以及一个 1.4 客户端,该客户端在 JRE 中没有 RemoteObjectInitationHandler 类.

您需要运行“rmic”并在服务器和客户端上正确部署 stub 。您尚未在服务器和客户端正确部署 stub 类。甚至在服务器上都找不到它。它应该位于两端的 JAR 文件中,而不是位于 CLASSPATH 未知的某个怪异目录中。

或者更新客户端以使用当前的 JDK。 1.4 已经是生命终结的许多年了。

关于java - RMI ClassNotFoundException : java. RMI.server.RemoteObjectInitationHandler 仅适用于 java 1.4.2 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20457163/

相关文章:

java - 如何让 Maven 3.2.5 理解使用 Java 7 的机器上的 Java 6 项目

java - Waffle SSPI如何设置SPNEGOmutualFlag

java - JSP EL : dynamic creation of property name

java - Spring RMI刷新StubOnConnectFailure不工作

java - 关闭 RMI 注册表

java - 有没有办法列出当前导出的远程对象?

java - 如何在 Mac 上的“应用程序名称”菜单下制作“关于”消息?

java - 如何在 Spring Kafka 中以编程方式设置 Jsonserializer Type Value 方法

rmi - 通过远程 Java 独立应用程序使用 EJB 3.1 bean

Java RMI 在租约到期后不关闭套接字