Springアプリケーションのデバッグ
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アプリケーションのデバッグをさらに簡単にするための特別なアドオンを持っていることもわかりました。