JDK 7 Update 21 以降では、RMI プロパティー java.rmi.server.useCodebaseOnly
がデフォルトで true に設定されています。以前のリリースでは、デフォルト値は false
でした。
注:この変更は、JDK 6 Update 45 と JDK 5 Update 45 リリースにも適用されます。
false
に設定した場合、このプロパティーは、RMI 接続の反対側が Java クラスをロードする際のネットワークの場所 (URL) を、RMI 接続の片側から指定することを許可します。このメカニズムの一般的な使用法は、RMI クライアントとサーバーがリモートインタフェースとデータクラスを互いに提供し合うことで、構成を不要にするような場合です。
RMI 接続の一方の端の JVM が java.rmi.server.codebase
システムプロパティーに 1 つ以上の URL を指定した場合、その情報は RMI 接続の反対側の端に渡されます。受信側の JVM がその java.rmi.server.useCodebaseOnly
システムプロパティーを false
に設定した場合、それらの URL を使用して、RMI 要求ストリームで参照される Java クラスをロードしようとします。
RMI 接続のリモート側で指定された場所からクラスをロードする動作は、java.rmi.server.useCodebaseOnly
が true
に設定されると無効化されます。この場合、クラスはローカルで指定された java.rmi.server.codebase
プロパティーやローカルの CLASSPATH など、事前構成された場所からのみロードされ、RMI 要求ストリームによって渡された codebase
情報は使用されません。
このデフォルト値への変更により、RMI ベースのアプリケーションが予期せず停止することがあります。一般的な症状は、ネストされた java.lang.ClassNotFoundException
を含む java.rmi.UnmarshalException
を含んだスタックトレースです。
これらの例外が発生した場合、問題を解決するための推奨される方法は、java.rmi.server.codebase
システムプロパティーで適切な値を指定することによって、すべての RMI クライアントおよびサーバーが同じコードベースを使用するように構成することです。このためには通常、アプリケーションを開始するコマンドに -D
オプションを追加します。
java -Djava.rmi.server.codebase=file:///<path-to-remote-classes>/
また、URL によって指定された場所へのアクセス権を許可するために、アプリケーションのセキュリティーポリシーファイル内のアクセス権を調整することが必要な場合もあります。これには FilePermission
や SocketPermission
などのアクセス権の付与が含まれます。
rmiregistry デーモンが特定のコードベースを使用するように構成するには、次の構文を使用することができます。
rmiregistry -J-Djava.rmi.server.codebase=file:///<path-to-remote-classes>/
rmid
によって開始される起動グループ JVM のコードベースを指定するには、別の構文が必要です。このデーモン自体は RMI 要求を処理しませんが、RMI 要求を処理する JVM サブプロセスを作成します。rmid
サブプロセスのコードベースを指定する構文は、次のとおりです。
rmid -C-Djava.rmi.server.codebase=file:///<path-to-remote-classes>/
場合によっては、RMI クライアントやサーバー、あるいは rmiregistry
や rmid
デーモンを特定のコードベースで事前構成することが難しかったり、不可能だったりすることがあります。このような場合に非互換性を解決する方法は、単純に java.rmi.server.useCodebaseOnly
プロパティーを false
の設定に戻すことです。これは次のコマンド行オプションを使用して実行できます。
java -Djava.rmi.server.useCodebaseOnly=false
rmiregistry
および rmid
コマンドでも同様の構文を使用します。
注意:java.rmi.server.useCodebaseOnly
プロパティーを false
に設定してシステムを実行することは、信頼できないコードのロードと実行が許可されるため、お勧めできません。