Mac上でRMIを使うアプリが動かなくなったのをやっと解決した

会社ではAlfrescoというECMのアプリを扱っています。で、Macのローカルに入れて開発していたのですが、ある日突然RMIまわりで「ObjID already in use」みたいなエラーになっていっさい動かなくなってしまった。Alfrescoのバージョンを変えても一緒。マシンに問題がありそうな感じ。

フォーラムなどを見ると/etc/hostsが変、もしくはポートがすでにふさがっているという可能性が上がっていましたが、どちらもチェック済み。途方に暮れているあたりで別の仕事も入ってきたりして、解決できないまま放置していました。最近になってまた開発する必要が出てきたため、もう一度調査をしていたのですが、まったく糸口がつかめない。

しかたないのでそのアプリではなく、Spring+RMIのサンプルプロジェクトを動かしてみたらどうかと思い、さっそく作ってみました。そこで奇妙なことが分かります。RMIのサーバ側でホスト名を指定せずに起動するとVMがローカルホストを勝手に解決してくれるのですが、この値がどうもおかしい。なぜか僕が属しているネットワークのルータ(DNSサーバを兼ねている)の値になっているのです。そして、サンプルのクライアントからも繋がってくれません。無理矢理固定するため-Djava.rmi.server.hostnameとかを設定すると正しく動くのです。

試しに java.net.IPAddress.getLocalHost() を取得してみると確かにIPがルータのものを返してくる。

ネットワーク接続周りを見ても、あやしいところはない。で、同僚がifconfigでどう見えるのかと聞いてくるので、出してみたところen1(イーサネット)がなぜかその(おかしな)アドレスを主張していることが判明。でもこのマシンはいまは有線は使ってないのです。そこでふと思い出したことがありました。自宅のネットワークがおかしかったときに、e-MobileMacに挿してネットに繋いだ状態で、ネットワーク共有を使って自宅のWindowsマシンをつなぎ、WindowsUpdateをしたことがあった、ということです。

設定の「共有」を見てみると確かにそのときの設定が残ったままで、このMac自体がルータとして機能していたようです。これをOFFにしたらやっと直りました。

長かった。