2012-02-16

Eclipse を使って開発した Play のアプリケーションを Eclipse 上でデバッグしようとすると、Play アプリケーションのプロセスとデバッガの連携に失敗する問題に遭遇することがあったりします。このエントリでは、その一つの原因と対処法について解説します。


現象

今回対象とする事象は、公式に書かれている内容 に従ってデバッグ手順を進めていて、Connect JPDA to プロジェクト名.launch をデバッグ実行しようとした際に、以下のようなエラーダイアログが表示される場合を想定しています。


原因

play のアプリケーションを、play eclipsify コマンドを用いて Eclipse プロジェクトに変換する際に、 というメッセージが表示されていませんでしたか?(※)

これはメッセージにあるとおり、デバッグ用に利用しようとしている既定のポート 8000 番を別のプログラムがすでに利用しているよ、ということを意味します。

このメッセージが表示されて eclipsify された Play アプリケーションは、Eclipse 上でのデバッグ実行時のデバッガ連携に利用する待ち受けポート番号が不定(アプリを立ち上げるたびにポート番号が変化する状態)となります。そのため、Play アプリケーションが待ち受けするデバッグ用ポート番号と、デバッガが期待するポート番号が食い違うために連携できず… という状態に陥ってしまい、結果としてデバッグできない状態となります。

※「play eclipsify したときの出力メッセージなんて憶えてないや…」という方は、実際に Play アプリケーションを Eclipse 上で実行したときのアプリケーションログで確認することもできます。 Play アプリを立ち上げると、最初に以下のようなログが出力されますが、この ~address: XXXX の部分の数字が既定のポート番号(8000)以外で、かつ Play アプリケーションを起動するたびに変化するようであれば、上述した状態となっていることがわかります。


対処法

この問題を解決するには、デバッグ用のポート番号を 8000 番以外の空いている任意の番号に変更(&固定)する必要があります。対処には以下の3つの作業が必要になります。

  1. デバッグに利用するポート番号を決める
  2. play eclipsify で生成されるファイル プロジェクト名.launch を編集する
  3. 同様に play eclipsify で生成されるファイル Connect JPDA to プロジェクト名.launch を編集する

順を追って、説明していきます。


1. デバッグに利用するポート番号を決める

開発 PC にインストールしているソフトウェアなどを確認し、デバッガと Play アプリケーションの連携に利用する任意の空きポート番号を決めます。


2. プロジェクト名.launch を編集する

1. で決めたデバッグ用のポート番号の値を、プロジェクト名.launch 内に記述されている Java VM 引数の文字列に設定します。

Java VM 引数の文字列は、key 属性が org.eclipse.jdt.launching.VM_ARGUMENTS である stringAttribute 要素に設定されています。 その文字列の ~,address=0 となっている部分の数字を、1. で決めたポート番号に設定しなおします。

以下の例では、ポート番号 8123 をデバッグ用のポートとして割り当てています。


3. Connect JPDA to プロジェクト名.launch を編集する

2. と同様に、デバッグ用のポート番号を Connect JPDA to プロジェクト名.launch 内に記述されている接続先ポート番号として設定します。

接続先ポート番号は、key 属性が port である mapEntry 要素の value 属性に設定されています。

以下は先ほどと同様に 8123 のポート番号を割り当てる例です。


補足

なお、application.conf にも JPDA のポート番号を指定する設定項目 jpda.port がありますが、Eclipse 上で実行する場合は起動時オプションの方が優先されるので、こちらを指定・変更する必要はありません。