Java RMI:未找到远程接口,抛出Java.lang.ClassNotFoundException,仅在重新启动后工作

Java RMI:未找到远程接口,抛出Java.lang.ClassNotFoundException,仅在重新启动后工作,java,client-server,rmi,Java,Client Server,Rmi,在Java RMI程序中,远程接口(CalcInterface.Java)似乎缺失。 所有java文件都在项目的src文件夹中(我使用IDEA)。没有梯度,什么都没有。 有: CalcClass.java CalcInterface.java Client.java Server.java 它们都被编译成项目的out/production/RMI目录。 RMI是项目的名称 IDEA没有编译错误。 但是,在运行Server.main()时 我得到以下例外情况: Server Exception

在Java RMI程序中,远程接口(CalcInterface.Java)似乎缺失。
所有java文件都在项目的src文件夹中(我使用IDEA)。没有梯度,什么都没有。
有:

  • CalcClass.java
  • CalcInterface.java
  • Client.java
  • Server.java
它们都被编译成项目的
out/production/RMI
目录。
RMI是项目的名称

IDEA没有编译错误。
但是,在运行Server.main()时 我得到以下例外情况:

Server Exception:java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: CalcInterface
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: CalcInterface
...
它在新启动时工作,但在我按住ctrl+C键启动服务器程序并重新运行它之后。它再也不起作用了。是的,我正在释放端口并重新启动注册表。
我不明白为什么它不能访问Caverterface

我还尝试过在src文件夹中使用javac编译所有这些java文件,然后运行
java服务器
,但这会产生相同的错误

在这里转储四个java文件,因为我不知道如何指定问题。
CalcInterface.java

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

public class Server {
    public static void main(String[] args) {
        try {
//            Instantiating implementation class
            CalcClass obj = new CalcClass();

//            Exporting object of implementation class to stub
            CalcInterface stub = (CalcInterface) UnicastRemoteObject.exportObject(obj,5000);

//            Binding stub to registry
            Registry registry = LocateRegistry.getRegistry();

            registry.bind("Calculator", stub);
            System.out.println("Server Ready");
        }
        catch (Exception e){
            System.err.println("Server Exception:" + e.toString());
            e.printStackTrace();
        }
    }
}
导入java.rmi.Remote;
导入java.rmi.RemoteException;
公共接口接口扩展到远程{
intadd(inta,intb)抛出RemoteException;
int subtract(int a,int b)抛出远程异常;
整数乘法(inta,intb)抛出远程异常;
双除法(inta,intb)抛出RemoteException,arithmetricexception;
}
CalcClass.java

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

public class Server {
    public static void main(String[] args) {
        try {
//            Instantiating implementation class
            CalcClass obj = new CalcClass();

//            Exporting object of implementation class to stub
            CalcInterface stub = (CalcInterface) UnicastRemoteObject.exportObject(obj,5000);

//            Binding stub to registry
            Registry registry = LocateRegistry.getRegistry();

            registry.bind("Calculator", stub);
            System.out.println("Server Ready");
        }
        catch (Exception e){
            System.err.println("Server Exception:" + e.toString());
            e.printStackTrace();
        }
    }
}
import java.rmi.RemoteException;
公共类CalcClass实现了calinterface{
@凌驾
公共int add(int a,int b)引发RemoteException{
返回a+b;
}
@凌驾
公共整数减法(整数a,整数b)引发RemoteException{
返回a-b;
}
@凌驾
公共整数乘法(整数a、整数b)引发RemoteException{
返回a*b;
}
@凌驾
公共双除法(inta,intb)引发RemoteException,ArtihmeticException{
返回(双)a/b;
}
}
Server.java

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

public class Server {
    public static void main(String[] args) {
        try {
//            Instantiating implementation class
            CalcClass obj = new CalcClass();

//            Exporting object of implementation class to stub
            CalcInterface stub = (CalcInterface) UnicastRemoteObject.exportObject(obj,5000);

//            Binding stub to registry
            Registry registry = LocateRegistry.getRegistry();

            registry.bind("Calculator", stub);
            System.out.println("Server Ready");
        }
        catch (Exception e){
            System.err.println("Server Exception:" + e.toString());
            e.printStackTrace();
        }
    }
}
不包含
Client.java
,因为我认为这与问题无关。
非常感谢您就这个问题或一般关于RMI或Java的任何建议。

谢谢大家!

使用
java.rmi.server.codebase
属性。 它充当一个源,从中将类加载到虚拟机中


您可以从中查阅。

这是不够的。您还需要运行HTTP服务器来为这些类提供服务。我设法解决了这个问题。事实证明,我必须在与.class文件相同的文件夹中启动
rmiregistry&
。我是在别的地方开始的,因此找不到其他的课程。我无法将此问题标记为已解决,如果mod或管理员可以这样做并将此评论标记为答案,我将不胜感激。