RMIを使って、リモートホストにあるクラスをダウンロードして実行する方法について説明します。 このページでは、RMIについてでは、ローカルホストを使って、RMIの概念を理解していることを前提にしています。
 RMIを使って、リモートホストにあるクラスをダウンロードして実行するためには、Webサーバにあるコードベース(codebase)を利用します。
コードベースとは、JVM(Java Virtual Machine)にクラスをロードするときの、クラスのある位置のことです。
 クライアント側には、インターフェイスモジュールを用意するだけで、ソースを作成することができます。
従って、インターフェイスを変更しなければ、サーバ側のクラスファイルが更新されても、クライアントプログラムを再コンパイルする必要はありません。
 動作の流れとしては、以下のようになります。
| 
 +-----------------+              +-----------------+
 |  +-----------+  |              |  +-----------+  |
 |  |  Client   |  |              |  |  Server   |  |
 |  +-----------+  |              |  +-----------+  |
 |       ↓参照    |              |       ↓登録    |
 |  +-----------+  |              |  +-----------+  |
 |  |  lookup() |  |              |  |  bind()   |  |
 |  +-----------+  |              |  +-----------+  |
 |      ↑ │      |              |       ↓        |
 |      │ │      |              |  +-----------+  |
 |      │ └----------------------->|rmiregistry|  | スタブインスタンスを返却
 |      │         |              |  +-----------+  |
 +------│---------+              +-----------------+
        │                        +-----------------+
        │                        |  +-----------+  |
        │                        |  | Web Server|  |
        │                        |  +-----------+  |
        └---------------------------| codebase  |  | スタブクラスをダウンロード
                                  |  +-----------+  |
                                  +-----------------+
 | 
 コードベースを使ったプログラミングでは、以下の手順は、RMIについてと同じものを使っています。
 RMIレジストリを起動する場合は、スタブファイルにCLASSPATHを設定しておかないと、クライアントから接続時にスタブを検索できないためエラーが発生します。
以下のファイルをWebサーバからアクセスできる、コードベースディレクトリにコピーします。
| unix# cp helloObj_Stub.class /usr/local/apache/htm/rmi/. | 
コピーしたら、そのURLにアクセスできることを確認します。
| unix# lynx http://www.ash.jp/rmi/ | 
クライアントプログラムを作成するためには、リモートインターフェイス(helloIf.class)が必要ですので、サーバからダウンロードします。
 クライアントプログラム(helloClient.java)を作成します。
 プログラムの処理は、レジストリサーバ(www)から、lookupメソッドでリモートインターフェイスを取得し、「Hello World!」を返却するメソッド(helloMsg)を呼び出しています。
| helloClient.java | 
|---|
| 
import java.rmi.*;
public class helloClient {
  public static void main(String args[]) {
    helloIf hello = null;
    try {
      // セキュリティマネージャの設定
      System.setSecurityManager(new RMISecurityManager());
      // レジストリサーバの検索
      hello = (helloIf)Naming.lookup("rmi://www.ash.jp/hello");
    } catch(Exception ex) {
      ex.printStackTrace();
    }
    try {
      // メッセージの取得
      System.out.println(hello.helloMsg());
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }
}
 | 
javacで、ソースファイルをコンパイルします。
| unix/dos# javac helloClient.java unix/dos# ls *.class helloIf.class helloClient.class | 
ローカルマシン上でテストする場合は、ポリシーファイル(java.policy)は必要ありませんが、リモートからアクセスする場合には必要となります。 とりあえず、以下のように設定することで、何でも許可されるようになります。 ただしセキュリティ上、問題がありますので、評価時だけ使うようにしてください。
| java.policy | 
|---|
| 
grant {
  permission java.security.AllPermission;
};
 | 
クライアントプログラムを起動し、「Hello World!」と表示されれば、成功です。
| unix/dos# java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=http://www.ash.jp/rmi/ helloClient Hello World! |