Springアプリケーションのデバッグ

Springアプリケーションのデバッグ

1. 前書き

デバッグは、ソフトウェアを作成するための最も重要なツールの1つです。

このチュートリアルでは、Springアプリケーションをデバッグする方法のいくつかを確認します。

また、Spring Boot、従来のアプリケーションサーバー、およびIDEがこれをどのように簡素化するかについても説明します。

2. Javaデバッグ引数

まず、Javaがすぐに使えるものを見てみましょう。

By default, the JVM does not enable debugging。 これは、デバッグがJVM内に追加のオーバーヘッドを作成するためです。 また、一般にアクセス可能なアプリケーションのセキュリティ上の問題になる可能性があります。

したがって、debugging should only be performed during developmentであり、本番システムでは使用できません。

デバッガーをアタッチする前に、まずデバッグを許可するようにJVMを構成する必要があります。 これを行うには、JVMのコマンドライン引数を設定します。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

これらの各値の意味を分析してみましょう。

-agentlib:jdwp

JVM内でJava Debug Wire Protocol(JDWP)エージェントを有効にします。 This is the main command line argument that enables debugging.

transport = dt_socket

デバッグ接続にネットワークソケットを使用します。 他のオプションには、Unixソケットと共有メモリが含まれます。

server = y

着信デバッガー接続をリッスンします。 nに設定すると、プロセスは着信接続を待つのではなく、デバッガーへの接続を試みます。 これがnに設定されている場合は、追加の引数が必要です。

suspend = n

起動時にデバッグ接続を待たないでください。 デバッガーが接続されるまで、アプリケーションは正常に起動して実行されます。 yに設定すると、デバッガーが接続されるまでプロセスは開始されません。

アドレス= 8000

JVMがデバッグ接続をリッスンするネットワークポート。

上記の値は標準であり、ほとんどのユースケースとオペレーティングシステムで機能します。 JPDA connection guideは、考えられるすべての値をより詳細にカバーします。

3. SpringBootアプリケーション

Spring Bootアプリケーションcan be started several ways。 最も簡単な方法は、コマンドラインからjavaコマンドを-jarオプションとともに使用することです。

デバッグを有効にするには、-Dオプションを使用してdebug引数を追加するだけです。

java -jar myapp.jar -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Mavenを使用すると、提供されたrun目標を使用して、デバッグを有効にしてアプリケーションを起動できます。

mvn spring-boot:run -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

同様に、Gradleでは、bootRunタスクを使用できます。 まず、build.gradleファイルを更新して、Gradleがコマンドライン引数をJVMに渡すようにする必要があります。

bootRun {
   systemProperties = System.properties
}

これで、bootRunタスクを実行できます。

gradle bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

4. アプリケーションサーバー

Spring Bootは近年非常に人気がありますが、従来のapplication serversは、現代のソフトウェアアーキテクチャでは依然としてかなり普及しています。 このセクションでは、人気のあるいくつかのアプリケーションサーバーのデバッグを有効にする方法を見ていきます。

ほとんどのアプリケーションサーバーは、アプリケーションを起動および停止するためのスクリプトを提供します。 デバッグの有効化は、通常、このスクリプトに引数を追加するか、環境変数を追加するだけです。

4.1. トムキャット

Tomcatの起動スクリプトの名前はcatalina.sh(Windowsではcatalina.bat)です。 デバッグを有効にしてTomcatサーバーを起動するには、引数の前にjpdaを追加します。

catalina.sh jpda start

デフォルトのデバッグ引数は、suspend=nでポート8000​​をリッスンするネットワークソケットを使用します。 これらは、JPDA_TRANSPORTJPDA_ADDRESS、およびJPDA_SUSPENDの1つ以上の環境変数を設定することで変更できます。

JPDA_OPTSを設定することで、デバッグ引数を完全に制御することもできます。 この変数が設定されると、他のJPDA変数よりも優先されます。 したがって、JVMの完全なデバッグ引数でなければなりません。

4.2. ワイルドフライ

Wildflyの起動スクリプトはstand-alone.shです。 デバッグを有効にしてWildflyサーバーを起動するには、–debugを追加します。

デフォルトのデバッグモードでは、ポート8787のネットワークリスナーがsuspend=nで使用されます。 –debug引数の後にポートを指定することで、ポートをオーバーライドできます。

デバッグ引数をより細かく制御するには、完全なデバッグ引数をJAVA_OPTS環境変数に追加するだけです。

4.3. Weblogic

Weblogicの起動スクリプトはstartWeblogic.shです。 デバッグを有効にしてWeblogicサーバーを起動するには、環境変数debugFlagtrueに設定します。

デフォルトのデバッグモードでは、ポート8453でsuspend=nのネットワークリスナーを使用します。 DEBUG_PORT環境変数を設定することで、ポートをオーバーライドできます。

デバッグ引数をより細かく制御するには、完全なデバッグ引数をJAVA_OPTIONS環境変数に追加するだけです。

Weblogicの最新バージョンは、サーバーを起動および停止するMavenプラグインも提供します。 This plugin will honor the same environment variables as the startup script

4.4. グラスフィッシュ

Glassfishの起動スクリプトはasadminです。 デバッグを有効にしてGlassfishサーバーを起動するには、–debugを使用する必要があります。

asadmin start-domain --debug

デフォルトのデバッグモードでは、ポート9009でsuspend=nのネットワークリスナーを使用します。

4.5. 桟橋

Jettyアプリケーションサーバーにはスタートアップスクリプトが付属していません。 代わりに、Jettyサーバーはjavaコマンドを使用して起動されます。

したがって、デバッグを有効にするには、標準のJVMコマンドライン引数を追加するだけです。

5. IDEからのデバッグ

さまざまなアプリケーションタイプでデバッグを有効にする方法を確認したので、デバッガーの接続を見てみましょう。

最新のIDEはすべてデバッグサポートを提供します。 これには、デバッグを有効にして新しいプロセスを開始する機能と、すでに実行中のプロセスをデバッグする機能の両方が含まれます。

5.1. IntelliJ

IntelliJは、SpringおよびSpringBootアプリケーションのファーストクラスのサポートを提供します。 デバッグは、mainメソッドを使用してクラスに移動し、三角形のアイコンを右クリックして、[デバッグ]を選択するだけです。

image

プロジェクトに複数のSpring Bootアプリケーションが含まれる場合、IntelliJはRun Dashboardツールウィンドウを提供します。 このウィンドウでは、1つの場所から複数のSpring Bootアプリケーションをデバッグできます。

image

Tomcatまたは他のWebサーバーを使用するアプリケーションの場合、デバッグ用のカスタム構成を作成できます。 Run>Edit Configurationsの下には、最も一般的なアプリケーションサーバー用のテンプレートがいくつかあります。

image

最後に、IntelliJを使用すると、実行中のプロセスに簡単に接続してデバッグできます。 As long as the application was started with the proper debug arguments、IntelliJは、別のホスト上にある場合でも接続できます。

Run/Debug Configurations画面で、Remoteテンプレートを使用して、すでに実行中のアプリケーションに接続する方法を構成できます。

image

IntelliJはホスト名とデバッグポートのみを知っている必要があることに注意してください。 便宜上、デバッグするアプリケーションで使用する適切なJVMコマンドライン引数を示します。

5.2. エクリプス

EclipseでSpringBootアプリケーションをデバッグする最も簡単な方法は、Package ExplorerまたはOutlineウィンドウからmainメソッドを右クリックすることです。

image

Eclipseのデフォルトのインストールでは、SpringまたはSpring Bootをそのままサポートしていません。 ただし、Eclipse Marketplaceには、IntelliJに匹敵するSpringサポートを提供するSpring Tools add-onがあります。

特にthe add-on provides a Boot Dashboard that lets us manage multiple Spring Boot applications from a single place

image

アドオンは、単一のSpring BootアプリケーションのデバッグをカスタマイズできるSpring Boot実行/デバッグ構成も提供します。 このカスタマイズされたビューは、標準のJava Application構成と同じ場所から利用できます。

ローカルまたはリモートホストですでに実行されているプロセスをデバッグするには、Remote Java Application構成を使用できます。

image

6. Dockerを使用したデバッグ

Spring application inside a Docker containerをデバッグするには、追加の構成が必要になる場合があります。 If the container is running locally and is not using host network modeの場合、デバッグポートはコンテナの外部からアクセスできなくなります。

Dockerでデバッグポートを公開する方法はいくつかあります。

docker runコマンドで–exposeを使用できます。

docker run --expose 8000 mydockerimage

EXPOSEディレクティブをDockerfileに追加することもできます。

EXPOSE 8000

または、Docker Composeを使用している場合は、それをYAMLに追加できます。

expose:
 - "8000"

7. 結論

この記事では、Javaアプリケーションのデバッグを有効にする方法を説明しました。

1つのコマンドライン引数を追加するだけで、Javaアプリケーションを簡単にデバッグできます。

また、MavenとGradleの両方、および最も一般的なIDEのすべてに、SpringアプリケーションとSpring Bootアプリケーションのデバッグをさらに簡単にするための特別なアドオンがあることがわかりました。