S-JIS[2009-12-18] 変更履歴

TomcatのRMI

サンプルについては、RMIのページおよびJBossのRMIのページを参照。JBossはTomcatベースであり、自分がRMIを試したのはJBossが先だから…


バインド時のバグ

RMIオブジェクトをバインドした際に、以下のような例外が発生した。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
	java.net.MalformedURLException: no protocol: Files/Apache
	at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
〜
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
	java.net.MalformedURLException: no protocol: Files/Apache
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
〜
Caused by: java.net.MalformedURLException: no protocol: Files/Apache
	at java.net.URL.<init>(Unknown Source)
	at java.net.URL.<init>(Unknown Source)
	at java.net.URL.<init>(Unknown Source)
	at sun.rmi.server.LoaderHandler.pathToURLs(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
〜

「no protocol: Files/Apache」って何じゃい?という話だが。
これはバグで、Tomcatをインストールしたパス(のディレクトリー名)にスペース(ブランク)が含まれている場合に発生するらしい。

例えばTomcatをインストールしたディレクトリーが「C:\Program Files\Apache Software Foundation\apache-tomcat-5.5.23」で、その下の「common/lib」にRMIオブジェクトのjarファイルが置いてあると、この例外が発生する。
パスが「C:/Program Files/Apache Software Foundation/〜/common/lib/rmi_sample.jar」となっており、スペース区切りで分解すると、ちょうど「Files/Apache」になる…。

なお、Tomcatのインストールディレクトリーがスペース入りの場合でも、「webapps/ウェブアプリ/WEB-INF/lib」の下にjarファイルが置いてある場合は大丈夫なようだ が、これは偶然かもなぁ。

RMIの仕組みとして、バインド時には、クラスパス(jarファイル一覧)をスペース区切りで列挙してrmiregistryに送信しているようだ。
rmiregistry側でそれをスペース区切りで分割してそれぞれをURLとして扱おうとする為、「Files/Apache」というURLが出てきてしまうというわけだ。(こういう処理をしようとして例外が起きているのは、バインド側でなく、rmiregistry側)
これはTomcatのバグというよりRMIのバグという感じがする。(だからTomcat4の頃にバグ報告されているのに、Tomcat5.5でも同じことが起きるんだろう)
いずれにしても対処方法としては、とにかくスペース入りのディレクトリー名を使わないこと!


Tomcatへ戻る / RMIへ戻る / JBossのRMIへ行く / Java目次へ行く
メールの送信先:ひしだま