JettyをEclipseと連携させる(リモートデバッグ編)

アプリケーション開発にデバッガーは欠かせません。ソースコードにブレークポイントを設定してステップ実行したり 実行中の変数の中身を確認したり。デバッガーを使えるようになれば バグを短時間で見つけて解決できるなどアプリケーションの品質向上に繋がります。

今回は 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 AsDebug Configurations... を開きます。

デバッグ構成ウィンドウが表示されます。左側のツリーから Remote Java Application を右クリックして New を選択します。もしくは Remote Java Application をダブルクリックします

左側ツリーの Remote Java Application の下にプロジェクト名のエントリーが追加されて 右側に構成が表示されます。

ポート番号などの構成を確認して Debug をクリックします。基本的にポート番号などの構成を変更する必要はありません。Jetty の起動時に引数で 8000 以外のポート番号を指定した場合は適宜変更してください。

デバッグを開始しても特に変化は起きません。ブラウザーを起動して Web アプリケーションの URL にアクセスしてみます。

Web アプリケーションへのアクセスが発生すると Eclipse が反応してダイアログが表示されます。デバッグ パースペクティブを開きますか? といった内容が英語で書かれているので yes をクリックします。

デバッグ パースペクティブに切り替わります。ブレークポイントを設定した行が反転表示されています。Variables ビューにはローカル変数 ab の値も表示されていますね。

ツールバーのボタンでデバッガを操作することができます。

操作       説明
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 アプリケーション開発がんばるぞい!

この記事を共有しませんか?