先日 IntelliJ IDEA 2020.3 がリリースされたので、何も考えずにアップグレードして使用していた。
開発中のプロジェクトはSpring BootでWebFluxを利用しているJavaプロジェクトだったが、
意図しない挙動をしている部分があったのでブレークポイントを仕掛けてデバッグを開始した。
しかし、不具合と思われる箇所が呼び出しされるはずのAPIを何度呼び出してもブレークポイントにヒットしない。
最初はAPI自体が呼び出しされていないのかと思ったが、呼び出しされた時だけに出力されるログは出力されている。
どうやら一部のGradleタスクから実行されたJavaプロセスがデバッグでプロセスは起動するが、
デバッガーがプロセスにアタッチされていない様だった。
GradleのJavaExec
などのタスクを直接実行するタスクだとデバッガーがアタッチされるが、
別のGradleタスクからJavaプロセスを呼び出すタスクを呼び出しした時にデバッガーがアタッチされない様だった。
今回ブレークポイントがヒットしなかったのはbootRunDev
というカスタムタスクだった。
このタスクはorg.springframework.boot
プラグインのbootRun
タスクに渡すJVMオプションを変数に追加して、
finalizedby
経由でbootRun
タスクを開始するというものだった。
問題はbootRunDev
タスクから起動したJavaアプリケーションは先日までデバッグできていたこと、
そしてJunit Jupiterのテストをデバッグ実行した時はブレークポイントで停止するということだった。
IntelliJ IDEAのバージョンアップでGradle経由でJavaプロセスのデバッグ自体が出来なくなったわけではなさそうだった。
何時間が設定をいじった後で、デバッグ構成のGradleテンプレートを確認すると「Debug all tasks on the execution graph」という項目を発見した。
該当の設定にチェックを入れてbootRunDev
タスクを実行するとブレークポイントがヒットするようになった。
IntelliJ IDEA 2020.3 依然と設定が変わったのか不明だが、
とにかく該当の設定変更でデバッグは出来るようになった。
欠点はこの設定を有効化すると、Gradleタスク中に実行されるすべてのコードでブレークポイントが反応するようになる。
例えばbuild
タスクの際に実行されるJunitテストコードに加えて、
テストコードから呼び出しされるライブラリやJDKのコードに仕掛けたブレークポイントもすべて反応するようになる。
とはいえ、開発中にデバッガーが動作しないという状況には代えられない。