2017-12-13 8 views
1

私はRMIを学びたいと思っています。単純な例を起動するように管理されていますが、クラスの動的ロードを実現できません。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 + "!"; 
    } 
} 

Server.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; 
}; 

私は、Webサーバー、のrmiregistryを開始し、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 

Webサーバ取得要求

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 

なぜを取得しますか?

答えて

0

クライアントがHelloインターフェイスを名前で使用している場合は、クラスパス上に存在する必要があります。コンパイル時と同じです。

コードベース機能は、から派生したもので、リモートインターフェイスに記載されています。この場合、コードベース機能を使用する必要はまったくありませんが、そうした場合は、そのクラスのインスタンスを送信しているJVMでcodebaseプロパティを設定する必要があります。

関連する問題