1前書き

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

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

Spring Boot、従来のアプリケーションサーバー、そしてIDEがどのようにこれを単純化するかについても見ていきます。


2 Javaデバッグ引数

まず、Javaが箱から出して何を提供するのかを見てみましょう。

  • デフォルトでは、JVMはデバッグを有効にしません** 。これは、デバッグによってJVM内に追加のオーバーヘッドが生じるためです。一般にアクセス可能なアプリケーションにとってはセキュリティ上の問題にもなります。

したがって、デバッグは開発中にのみ実行し、運用システムでは実行しないでください。

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

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

それぞれの値が何を意味するのかを見てみましょう。


  • – agentlib:jdwp

    **

JVM内でJavaデバッグワイヤプロトコル(JDWP)エージェントを有効にします。これはデバッグを可能にする主なコマンドライン引数です。


  • transport = dt

    socket__ **

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


  • server = y

    **

着信デバッガ接続を待ちます。

n

に設定すると、プロセスは着信接続を待たずにデバッガへの接続を試みます。これが

n

に設定されている場合、追加の引数が必要です。


  • suspend = n

    **

起動時にデバッグ接続を待たないでください。デバッガが接続されるまで、アプリケーションは正常に起動して実行されます。

y

に設定すると、デバッガがアタッチされるまでプロセスは開始されません。


  • アドレス= 8000

    **

JVMがデバッグ接続を待機するネットワークポート。

上記の値は標準的なもので、ほとんどのユースケースとオペレーティングシステムで機能します。

JPDA接続ガイド

には、考えられるすべての値が詳細に記載されています。


3 Spring Bootのアプリケーション

Spring Bootアプリケーションhttps://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-running-your-application.html#using-boot-running-your-applicationいくつかの方法]。最も簡単な方法は、

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

タスクを使うことができます。まず、GradleがJVMにコマンドライン引数を渡すように

build.gradle

ファイルを更新する必要があります。

bootRun {
   systemProperties = System.properties
}

これで

bootRun

タスクを実行できます。

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


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

Spring Bootは近年非常にポピュラーになりましたが、伝統的なhttps://www.baeldung.com/java-servers[アプリケーションサーバー]は現代のソフトウェアアーキテクチャではまだかなり一般的です。このセクションでは、いくつかのより一般的なアプリケーションサーバーのデバッグを有効にする方法を見ていきます。

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


4.1. Tomcat


Tomcat

の起動スクリプトは

catalina.sh

(Windowsでは

catalina.bat

)です。デバッグを有効にしてTomcatサーバーを起動するには、引数の先頭に

jpda

を追加します。

catalina.sh jpda start

デフォルトのデバッグ引数は

suspend = n

でポート8000​​をリッスンするネットワークソケットを使用します。これらは、

__、

JPDA

ADDRESS

、および

JPDA

SUSPEND__のいずれかの環境変数を設定することで変更できます。

____を設定することで、デバッグ引数を完全に制御することもできます。この変数が設定されると、他のJPDA変数よりも優先されます。

したがって、これはJVMの完全なデバッグ引数でなければなりません。


4.2. ワイルドフライ


Wildfly

の起動スクリプトは

stand-alone.sh

です。

デバッグを有効にしてWildflyサーバーを起動するには、

– debug

を追加します。

デフォルトのデバッグモードでは、ポート8787で

suspend = n

のネットワークリスナーを使用します。

– debug

引数の後にポートを指定することで、ポートを上書きすることができます。

debug引数をより細かく制御するには、

JAVA

OPTS__環境変数に完全なデバッグ引数を追加するだけです。


4.3. Weblogic

Weblogicの起動スクリプトは

startWeblogic.sh

です。デバッグを有効にしてWeblogicサーバを起動するには、環境変数

debugFlag



true

に設定します。

デフォルトのデバッグモードは

suspend = n

でポート8453のネットワークリスナを使用します。

DEBUG

PORT__環境変数を設定することでポートを上書きすることができます。

debug引数をより細かく制御するには、

JAVA

OPTIONS__環境変数に完全なデバッグ引数を追加するだけです。

Weblogicの最新バージョンには、サーバを起動および停止するためのMavenプラグインも用意されています。 ** このプラグインはスタートアップスクリプトと同じ環境変数を尊重します。


4.4. グラスフィッシュ

Glassfishの起動スクリプトは

asadmin

です。デバッグを有効にしてGlassfishサーバーを起動するには、

– debug

を使用する必要があります。

asadmin start-domain --debug

デフォルトのデバッグモードは

suspend = n

でポート9009のネットワークリスナを使用します。


4.5. 桟橋

Jettyアプリケーションサーバーには起動スクリプトが付属していません。

代わりに、Jettyサーバーは

java

コマンドを使用して起動されます。

したがって、デバッグを有効にすることは、標準のJVMコマンドライン引数を追加するのと同じくらい簡単です。


5 IDEからのデバッグ

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

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


5.1. IntelliJ


IntelliJ

はSpringおよびSpring Bootアプリケーション用の一流のサポートを提供しています。デバッグは、

main

メソッドを使用してクラスに移動し、三角形のアイコンを右クリックして[デバッグ]を選択するのと同じくらい簡単です。

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

Tomcatまたは他のWebサーバーを使用しているアプリケーションの場合は、デバッグ用のカスタム構成を作成できます。

Run

>

Edit Configurations

の下に、最も一般的なアプリケーションサーバー用のテンプレートがいくつかあります。

最後に、IntelliJは実行中のプロセスに接続してそれをデバッグすることを非常に簡単にします。 ** アプリケーションが適切なデバッグ引数で起動されている限り、IntelliJは別のホスト上にあっても接続できます。

[Run/Debug Configurations]画面の__remoteテンプレートを使用して、すでに実行中のアプリケーションにアタッチする方法を設定できます。

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


5.2. Eclipse

EclipseでSpring Bootアプリケーションをデバッグする最も簡単な方法は、

Package Explorer

または

Outline

ウィンドウからmainメソッドを右クリックすることです。

Eclipseのデフォルトインストールでは、そのままではSpringまたはSpring Bootをサポートしていません。しかし、IntelliJに匹敵するSpringサポートを提供するhttps://www.eclipse.org/community/eclipse__newsletter/2018/february/springboot.php[Spring Toolsアドオン]が入手可能です。

最も注目に値する** アドオンは私達が単一の場所から複数のSpring Bootアプリケーションを管理することを可能にするBoot Dashboardを提供します。

アドオンはまた、単一のSpring Bootアプリケーションのデバッグをカスタマイズすることを可能にする

Spring Boot

Run/Debug Configurationを提供します。このカスタマイズされたビューは、標準の

Java Application

設定と同じ場所から入手できます。

ローカルでもリモートホストでも、すでに実行中のプロセスをデバッグするには、

Remote Java Application

設定を使用できます。


6. Docker

を使ったデバッグ


Dockerコンテナ内のSpringアプリケーション

をデバッグするには、追加の設定が必要になる場合があります。

コンテナがローカルで実行されていて、ホストネットワークモードを使用していない場合

は、デバッグポートはコンテナの外からはアクセスできません。

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


docker run

コマンドで

– expose

を使用できます。

docker run --expose 8000 mydockerimage


Dockerfile



EXPOSE

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

EXPOSE 8000

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

expose:
 - "8000"


7. 結論

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

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

また、MavenとGradle、そして最も人気のあるIDEの両方が、SpringとSpring Bootアプリケーションのデバッグをさらに簡単にするための特別なアドオンを持っていることもわかりました。