Jetty Maven Pluginで起動したNablarchのWebアプリケーションをデバッグする

# What's？

Nablarch 6では、ローカルでWebアプリケーションを動かす用途としてJetty 12を使用しています。

具体的にはJetty Maven Pluginを使い、`jetty:run`で起動します。

https://nablarch.github.io/docs/6u2/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_Web.html

https://nablarch.github.io/docs/6u2/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_WebService.html

Nablarch 5まではWAITTを使用していましたが、その切り替え方法はこちらです。

[Nablarch 5から6への移行ガイド / 移行手順の詳細 / Jakarta EE対応 / waitt-maven-pluginをjetty-ee10-maven-pluginに変更する](https://nablarch.github.io/docs/6u2/doc/migration/index.html#waitt-maven-pluginjetty-ee10-maven-plugin)

今回はJetty Maven Pluginで起動したNablarchのWebアプリケーションのデバッグ方法をメモしておきます。

# mvnDebug

Apache Mavenには`mvnDebug`というコマンドが付属しています。

実体としてはこちらで、環境変数`MAVEN_OPTS`に`-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000`を追加したものです。

```shell:mvnDebug
MAVEN_DEBUG_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=${MAVEN_DEBUG_ADDRESS:-8000}"

echo Preparing to execute Maven in debug mode

env MAVEN_OPTS="$MAVEN_OPTS" MAVEN_DEBUG_OPTS="$MAVEN_DEBUG_OPTS" "`dirname "$0"`/mvn" "$@"
```

https://github.com/apache/maven/blob/maven-3.9.9/apache-maven/src/bin/mvnDebug

https://github.com/apache/maven/blob/maven-3.9.9/apache-maven/src/bin/mvnDebug.cmd

このコマンド経由で`jetty:run`を起動することで、プロセスにアタッチしてデバッグすることができます。

なので、実際にはNablarch固有の方法ではなくこの手のMavenプラグインのデバッグにも応用できる話ではあります。

# Jetty Maven Plugin

Jetty Maven Pluginのデフォルトのデプロイメントモード（`deployMode`）は`EMBED`です。

[Using the Jetty Maven Plugin / Deployment Modes](https://jetty.org/docs/jetty/12/programming-guide/maven-jetty/jetty-maven-plugin.html#deployment-modes)

このため、`mvnDebug`で有効にした`MAVEN_OPTS`の内容がそのまま作用します。

`deployMode`を`FORK`にした場合は`jvmArgs`での設定になると思います。

# 環境

今回の環境はこちらです。

```shell
$ java --version
openjdk 17.0.12 2024-07-16
OpenJDK Runtime Environment (build 17.0.12+7-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 17.0.12+7-Ubuntu-1ubuntu222.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: /home/charon/.sdkman/candidates/maven/3.9.9
Java version: 17.0.12, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.15.0-124-generic", arch: "amd64", family: "unix"
```

また、デバッグにはIntelliJ IDEA Community Editionを使用します。

# Nablarchのブランクプロジェクトを作成する

確認用のブランクプロジェクト作成します。

今回は、RESTfulウェブサービスを使うことにします。

https://nablarch.github.io/docs/6u2/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_WebService.html

ブランクプロジェクトの作成。

```shell
$ mvn archetype:generate \
  -DinteractiveMode=false \
  -DarchetypeGroupId=com.nablarch.archetype \
  -DarchetypeArtifactId=nablarch-jaxrs-archetype \
  -DarchetypeVersion=6u2 \
  -DgroupId=com.example \
  -DartifactId=hello-nablarch-jaxrs \
  -Dversion=0.0.1 \
  -Dpackage=com.example
```

プロジェクト内に移動。

```shell
$ cd hello-nablarch-jaxrs
```

まずは通常どおりJettyを起動して動作確認。

```shell
$ mvn jetty:run
```

```shell
$ curl localhost:9080/find/json
[{"userId":1,"kanjiName":"名部楽太郎","kanaName":"なぶらくたろう"},{"userId":2,"kanjiName":"名部楽次郎","kanaName":"なぶらくじろう"}]
```

# mvnDebugを使ってデバッグする

では、今度は`mvnDebug`で`jetty:run`を起動します。

```shell
$ mvnDebug jetty:run
```

起動するとアタッチ待ちになるので

```shell
Preparing to execute Maven in debug mode
Listening for transport dt_socket at address: 8000
```

プロセスにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/4d570cec-8998-2348-7828-a2db8c529343.png)

対象はポート番号が表示されているものなりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/05eb2cd9-321a-d531-118f-80fc5411c87f.png)

アタッチすると停止していたMavenプロセスが動き出すので、あとはブレークポイントをつけるなりしてデバッグします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/8cfea82f-f507-3d14-dd51-595d65e76689.png)

Mavenがアタッチ待ちになるのが嫌だという場合は、`suspend`を`n`にしてあとからアタッチすればよいでしょう。

```shell
$ MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000' mvn jetty:run
```