アプリケーション開発にデバッガーは欠かせません。ソースコードにブレークポイントを設定してステップ実行したり、 実行中の変数の中身を確認したり。デバッガーを使えるようになれば、 バグを短時間で見つけて解決できるなどアプリケーションの品質向上に繋がります。
今回は、 Jetty で実行している Web アプリケーション (WAR ファイル) を Eclipse からデバッグする方法を紹介します。
Java Debug Wire Protocol(JDWP)
Java 仮想マシンには Java Platform Debugger Architecture (JPDA) と呼ばれるデバッガーをサポートするためのアーキテクチャが標準で備わっています。JPDA に含まれるインターフェースの 1 つである Java Debug Wire Protocol(JDWP) を有効にすることで、 Java アプリケーションへデバッガをアタッチできるようになります。
Eclipse も特別なプラグインを追加することなく、 Java Debug Wire Protocol(JDWP)を有効にしている Java アプリケーションをデバッグできるようになっています。
JDWPを有効にしてJettyを起動する
以下のサイトでダウンロードできる Windows 版 Jetty にはデフォルトで JDWP が有効になる機能が備わっています。
Windows版 JettyでJDWPを有効にする方法
jetty.exe
を通常のプロセスとして起動した場合、 自動的に JDWP が有効になります。(Windows サービスとして起動した場合は JDWP が有効にならないのでプロダクション環境でも安心して運用できるようになっています。)
コマンドプロンプトC:¥>jetty.exe
JAR版 JettyでJDWPを有効にする方法
java コマンドで start.jar
を起動する場合は -agentlib
オプションで jdwp
の設定をおこないます。
コマンドプロンプトC:¥>java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n -jar start.jar
これで、 ポート 8000 でデバッガがアタッチできる状態で Jetty が起動します。
EclipseのデバッガでJettyに接続してデバッグする
Eclipse を起動してプロジェクトを開きます。
適当な Web アプリケーションのプロジェクトがない場合は、 以前の記事を参考に簡単なプロジェクトを作成してみてください。
デバッグ実行する前に少しソースコードを増やしておきましょう。MyResource.java
に以下のコードを追加しておきました。
適当なコードを追加int a = 2;
int b = 3;
int c = a + b;
ソースコードの行番号の左側をダブルクリックするとブレークポイントを設定することできます。デバッグ実行中にブレークポイントに到達すると自動的にプログラムが一時停止してくれます。
設定されたブレークポイントは青い丸印で表されます。
ブレークポイントの設定ができたら、 デバッグ実行を開始しましょう。この時点で Jetty プロセスは起動状態にしておいてくださいね。
Project Explorer でプロジェクトを選択して右クリック、 Debug As → Debug Configurations... を開きます。
デバッグ構成ウィンドウが表示されます。左側のツリーから Remote Java Application
を右クリックして New を選択します。(もしくは Remote Java Application
をダブルクリックします。)
左側ツリーの Remote Java Application
の下にプロジェクト名のエントリーが追加されて、 右側に構成が表示されます。
ポート番号などの構成を確認して Debug をクリックします。基本的にポート番号などの構成を変更する必要はありません。Jetty の起動時に引数で 8000
以外のポート番号を指定した場合は適宜変更してください。
デバッグを開始しても特に変化は起きません。ブラウザーを起動して Web アプリケーションの URL にアクセスしてみます。
Web アプリケーションへのアクセスが発生すると、 Eclipse が反応してダイアログが表示されます。「デバッグ ・ パースペクティブを開きますか?」 といった内容が英語で書かれているので yes をクリックします。
デバッグ ・ パースペクティブに切り替わります。ブレークポイントを設定した行が反転表示されています。Variables
ビューにはローカル変数 a
と b
の値も表示されていますね。
ツールバーのボタンでデバッガを操作することができます。
操作 | 説明 |
---|---|
Step Into (F5) | 現在のステートメントを実行してから次のステートメントで停止します。現在のステートメントがメソッドの呼び出しである場合、 デバッガはそのメソッドに対してステップ インを実行します。そうでない場合は、 次のステートメントで停止します。 |
Step Over (F6) | 現在のステートメントを実行してから次のステートメントで停止します。現在のステートメントがメソッドの呼び出しである場合、 デバッガはそのメソッド全体を実行し、 メソッド呼び出し後の次のステートメントで停止します。 |
Step Return (F7) | 現在のメソッドの外にステップします。メソッドが入れ子になっている場合 1 レベル上にステップします。 |
Resume (F8) | 最後または次のブレークポイントまで処理を続行します。 |
F8 を押す処理が続行されブラウザーに結果が表示されます。
デバッグを終了するときは、 ツールバーから Disconnect アイコンをクリックします。
デバッガを切断した後もパースペクティブはデバッグ ・ パースペクティブに切り替わったままになります。右上のアイコンをクリックして、 Java EE パースペクティブに戻しておきましょう。
一度、 実行したデバッグ構成は自動的に保存されます。もう一度、 同じアプリケーションをデバッグする場合はツールバーのデバッグアイコン右側の▼をクリックします。以前に作成したデバッグ構成が一覧表示されるので、 デバッグ実行したい構成を選択します。
Jetty と Eclipse を連携させて Web アプリケーションをデバッグする手順の紹介は以上です。Java Debug Wire Protocol(JDWP) を使った Java アプリケーションのデバッグは、 Jetty や Web アプリケーションに限らず他の環境や構成でも利用することができます。
今回は、 接続先を localhost
としましたが、 リモート ・ コンピューター上の Java 仮想マシンに接続してデバッグをすることも可能です。
デバッガを使いこなして Java アプリケーション開発がんばるぞい!