首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态类加载

动态类加载
EN

Stack Overflow用户
提问于 2017-12-13 13:47:16
回答 1查看 1.1K关注 0票数 2

我在努力学习人机界面。成功地启动了一个简单的示例,但我无法实现类的动态加载。

Hello.java

代码语言:javascript
复制
package com.example;

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

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

HelloImpl.java

代码语言:javascript
复制
package com.example;

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

Server.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
grant {
    permission java.security.AllPermission;
};

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

代码语言:javascript
复制
java -Djava.rmi.server.codebase=http://localhost:8000/ -Djava.security.policy=rmi.policy com.example.Client Hivemaster

web服务器get请求

代码语言:javascript
复制
127.0.0.1 - - [13/Dec/2017 14:06:45] "GET /com/example/Hello.class HTTP/1.1" 200

但程序异常

代码语言:javascript
复制
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

为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 23:01:04

如果客户端按名称使用Hello接口,则它必须存在于其类路径中。与编译时相同。

代码库特性用于从远程接口中提到的类派生出来的类。在这种情况下,根本不需要使用代码库特性:但如果需要使用代码库属性,则需要在发送这些类的实例的JVM上设置代码基属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47794554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档