当前位置: 首页 > 知识库问答 >
问题:

Java RMI ClassNotFound异常

穆丁雨
2023-03-14

我决定写RMI(从书中)也从书中获取代码。我用rmic创建了存根,并启动了rmiregistry,但当我决定编写java启动服务器时,我遇到了一个问题,实际上我面临的问题是:java-classpath D:\RMI AddServer Exception:java。马绍尔群岛共和国。ServerException:服务器线程中发生RemoteException;唯一的例外是:java。马绍尔群岛共和国。解组异常:错误解组参数;嵌套的例外是:java。lang.ClassNotFoundException:AddServerImpl_存根请我需要帮助,我因此损失了很多时间:(

地址服务器ntf.java

package rmi.app;
import java.rmi.*;
 public interface AddServerIntf extends Remote {
  double add(double d1,double d2) throws RemoteException;}

AddServerImpl

package rmi.app;
import java.rmi.*;
import java.rmi.server.*;
public class AddServerImpl  extends UnicastRemoteObject implements AddServerIntf {

public AddServerImpl() throws RemoteException {}

public double add(double d1, double d2) throws RemoteException {
        return d1+d2;
    }

}

地址服务器

   package rmi.app;
    import java.net.*;
  import java.rmi.*;
   public class AddServer {
public static void main(String[] args) {

    try {

    AddServerImpl addServerImpl = new AddServerImpl();
    Naming.rebind("AddServer", addServerImpl);      
    }
    catch (Exception e){
        System.out.println("Exception:"+e);
    }

}

  }

地址客户端

   package rmi.app;
   import java.rmi.Naming;
    public class AddClient {
public static void main(String[] args) {

    try{
        String addServerURL= "rmi://"+args[0]+ "/AddServer";
        AddServerIntf addServer =(AddServerIntf)Naming.lookup(addServerURL);
        System.out.println("The first number is:"+args[1]);
        double d1= Double.valueOf(args[1]).doubleValue();
        System.out.println("The second number is:"+args[2]);
        double d2= Double.valueOf(args[2]).doubleValue();
        System.out.println("the sum is:"+ addServer.add(d1,d2));

    }
    catch(Exception e){
        System.out.println("Exception : "+ e);
    }

}

     }

共有3个答案

潘安平
2023-03-14

将AddServerImpl构造函数更改为调用super(0)。那么您甚至不需要生成存根,更不用说部署它了。请参阅UnicastRemoteObject的Javadoc序言。

益锦程
2023-03-14

简短回答:注册表需要在其类路径上有存根。

详细回答:找一个过去10年里没有使用rmic的rmi教程,因为你已经很久没有需要做这些了。

尚阳炎
2023-03-14

我正在写一个JavaRMI应用程序,我经历了很多才能够使其工作。经过大量的研究和尝试,我得到了这个“食谱”:

  1. 不要安装SecurityManager
  2. 不要使用策略文件
  3. 确保要从一个VM移动到另一个VM的类同时位于客户端和服务器类路径中(或者位于同一个jar/war中)
  4. 如果您使用hibernate进行数据库访问,请将JAR也放在客户机中。Hibernate“更改”原始类,客户端将需要它来反序列化它
  5. 如果您还在服务器端使用Spring,您可能会在客户机中包含Spring orm和Spring数据jpa JAR,如果您遇到ClassNotFoundException,然后是JpaObjectRetrievalFailureException
  6. 我没有在JAR之外运行任何东西(根本没有rmi服务)
  7. 我没有创建存根,因为我使用的是Java6

我的服务器纯粹是这样做的:

try {
        try {
            LocateRegistry.createRegistry(SERVER_PORT);
        } catch (RemoteException e) {
            LocateRegistry.getRegistry(SERVER_PORT);
            e.printStackTrace();
        }
        System.setProperty("java.rmi.server.hostname", SERVER_HOST);
        connectionRequestHandler = new ConnectionRequestHandlerImpl();
        dataRequestHandler = new DataRequestHandlerImpl();
        String rmiUrl = "rmi://" + SERVER_HOST + ":" + SERVER_PORT + "/";
        Naming.rebind(rmiUrl + "ConnectionRequestHandler", connectionRequestHandler);
        Naming.rebind(rmiUrl + "DataRequestHandler", dataRequestHandler);
    } catch (RemoteException e1) {
        e1.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

然后在客户机上,我正在做:

String rmiUrl = "rmi://" + SERVER_HOST + ":" + SERVER_PORT + "/";
    try {
        connectionRequestHandler = (ConnectionRequestHandler)Naming.lookup(rmiUrl + "ConnectionRequestHandler");
        dataRequestHandler = (DataRequestHandler)Naming.lookup(rmiUrl + "DataRequestHandler");
    } catch (MalformedURLException e) {
        throw new RmiServicesDownException(e.getMessage());
    } catch (RemoteException e) {
        throw new RmiServicesDownException(e.getMessage());
    } catch (NotBoundException e) {
        throw new RmiServicesDownException(e.getMessage());
    } catch (Exception e ){
        e.printStackTrace();
        return;
    }

这就是我的工作方式。与第一次安装相比,您可能遇到的任何其他问题都很容易解决。

 类似资料:
  • 应用程序通常会通过抛出另一个异常来响应异常。 实际上,第一个异常引起第二个异常。 它可以是非常有助于用户知道什么时候一个异常导致另一个异常。 “异常链(Chained Exceptions)”帮助程序员做到这一点。 以下是Throwable中支持异常链的方法和构造函数。 Throwable getCause() Throwable initCause(Throwable) Throwable(St

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 问题内容: 异常存储在哪里?堆,堆。如何为异常分配和释放内存?现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象? 问题答案: 我假设为异常分配的内存分配方式与所有其他对象(在堆上)分配方式相同。 这曾经是个问题,因为您不能为OutOfMemoryError分配内存,这就是直到Java 1.6之前 才没有堆栈跟踪的原因。现在,它们也为stacktrace预分配了空间。 如果您想知道在抛

  • 异常Exception 以传统的try,catch抓取异常 如果在业务层不catch,框架层会捕捉,并返回一个500的server error响应。 如果在开发环境会返回一个500的具体错误的trace响应。 try { throw new \Exception("Error Processing Request", 1); //yield throwExc

  • 因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产

  • 当面对选择抛出异常的类型时,您可以使用由别人编写的异常 - Java平台提供了许多可以使用的异常类 - 或者您可以编写自己的异常类。 如果您对任何以下问题回答“是”,您应该编写自己的异常类;否则,你可以使用别人的。 你需要一个Java平台中没有表示的异常类型吗? 如果用户能够区分你的异常与由其他供应商编写的类抛出的异常吗? 你的代码是否抛出不止一个相关的异常? 如果您使用他人的例外,用户是否可以访

  • 异常 对于异常处理,倾向使用 raise 而不是 fail。 # 差 fail SomeException, 'message' # 好 raise SomeException, 'message' 不要在带双参数形式的 raise 方法中显式指定 RuntimeError。 # 差 raise RuntimeError, 'message' # 好 - 默认就是 RuntimeError rai

  • 在Java语言中,是使用“异常(exception)”来处理错误及其他异常事件。术语“异常”是短语“异常事件(exceptional event)”的缩写。 异常是在程序执行期间发生的事件,它会中断程序指令的正常流程。 当在方法中发生错误时,该方法创建一个对象并将其移交给运行时系统。 该对象称为“异常对象(exception object)”,包含有关错误的信息,包括错误发生时其类型和程序的状态。