Java RMI:未找到远程接口,抛出Java.lang.ClassNotFoundException,仅在重新启动后工作
在Java RMI程序中,远程接口(CalcInterface.Java)似乎缺失。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文件都在项目的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或管理员可以这样做并将此评论标记为答案,我将不胜感激。