RMIの入門、スタブのロード編です。
javacでコンパイルし、RMI用interfaceを実装したサーバ側のクラスをrmicにかけてスタブの作成を行えば実効可能になります、と書いたらもっと面倒だろうとの指摘を受けて、RMI入門の続編を書くことにしました。まずはスタブのロードについて。
RMI用interfaceを実装したサーバのクラスをrmicにかけるとスタブクラスとスケルトンクラスが作成されます。
% rmic ServerEnvironmentImpl % ls ServerEnvironmentImpl.class ServerEnvironmentImpl_Stub.class ServerEnvironmentImpl_Skel.class
いまのJREではスケルトンクラスは使用しなくなりましたが、互換性のためにデフォルトでは勝手に作成されます。-v1.2をつけてrmicを起動すればスタブクラスだけが作成されます。
スタブクラスというのは、クライアントがRMIのリモートオブジェクトを参照するときに、クライアント側においてあたかもサーバのオブジェクトであるかのように振舞うクラスです。実体はクライアントからリモートオブジェクトへのメソッド呼び出し要求をサーバに伝え、サーバからの応答をクライアントに返すという中継の機能を提供します。
スタブクラスはサーバの実装クラスから生成されるもので、通常はクライアント側にはありません。クライアントが動作するときに、動的にネットワーク上からロードされるという使い方が一般的になります。普通はRMIサーバが動いているホストのWWWサーバからとってくる様にします。
RMIが動いているホストがpoisonhost.domainだとします。ServerEnvironment_Stub.classをhttp://poisonhost.domain/ServerEnvironment_Stub.classでアクセスできるところに置きます(とりあえずjarにはしないとして)。この場合はcodeBaseがhttp://poisonhost.domain/だと考えます。
クライアントを起動する時に、
% java -Djava.rmi.server.codebase=http://poisonhost.domain/ EnvironmentClientの様にcodeBaseを指定して起動すると、動的にスタブクラスがクライアントにロードされます(やっぱり手抜きの説明になっちゃった)。
セキュリティマネージャとセキュリティ設定については、また。