gpt4 book ai didi

java - RMI动态类加载

转载 作者:太空宇宙 更新时间:2023-11-04 10:51:25 26 4
gpt4 key购买 nike

我正在尝试学习 RMI。成功启动了一个简单的示例,但无法实现类的动态加载。

Hello.java

package com.example;

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

public interface Hello extends Remote {
String greet(String name) throws RemoteException;
}

HelloImpl.java

package com.example;

public class HelloImpl implements Hello {
public String greet(String name) {
System.out.println("Call from " + name);
return "Hello " + name + "!";
}
}

服务器.java

package com.example;

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

public class Server extends HelloImpl {
public Server() {}

public static void main(String args[]) {
System.setSecurityManager(new SecurityManager());
try {
HelloImpl greeter = new HelloImpl();

Hello stub = (Hello) UnicastRemoteObject.exportObject(greeter, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);

System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}

Client.java

package com.example;

import java.rmi.Naming;

public class Client {
private Client() {}

public static void main(String[] args) {
System.setSecurityManager(new SecurityManager());
try {
Hello stub = (Hello) Naming.lookup("//localhost/Hello");

System.out.println(stub.greet(args[0]));
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}

rmi.policy

grant {
permission java.security.AllPermission;
};

我启动了 rmiregistry、Web 服务器并执行了 java -Djava.security.policy=rmi.policy com.example.Server。当我尝试使用命令启动客户端应用程序时

java -Djava.rmi.server.codebase=http://localhost:8000/ -Djava.security.policy=rmi.policy com.example.Client Hivemaster

网络服务器获取请求

127.0.0.1 - - [13/Dec/2017 14:06:45] "GET /com/example/Hello.class HTTP/1.1" 200

但是程序出现异常

Exception in thread "main" java.lang.NoClassDefFoundError: com/example/Hello
at com.example.Client.main(Client.java:17)
Caused by: java.lang.ClassNotFoundException: com.example.Hello
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more

为什么?

最佳答案

如果客户端按名称使用 Hello 接口(interface),则该接口(interface)必须出现在其类路径中。与编译时相同。

代码库功能适用于从远程接口(interface)中提到的那些派生的类。在这种情况下,根本不需要使用代码库功能:但如果您这样做,则需要在发送这些类的实例的 JVM 上设置代码库属性。

关于java - RMI动态类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com