Visual Studio CodeでOpen LibertyサーバーサイドJavaアプリをデバッグする

#はじめに

これまでフロントエンドはVisual Studio Code、サーバーサイドはEclipseで開発をしていましたが、Eclipseのヒープが結構とられるため、Visual Studio CodeでJavaも開発できるようにしたいと思います。
私の仕事柄、以下の機能が必要となります。

- Javaでコーディングするだけでなく、ローカルでJava EEアプリをデバッグしたい
- アプリケーションサーバーとしてOpen Libertyを利用したい

参考

https://www.youtube.com/watch?v=6wJRxUGdNRM

#セットアップ

Visual Studio CodeでJavaで開発環境を整えるため、前提として以下のセットアップを行います。

- Java SDK (JREではないです)
- maven
- Visual Studio Code

Visual Studio Codeを立ち上げたら、以下の拡張機能をインストールします。

- Extention Pack for Java ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467288/a31f73bf-9a63-463c-8320-de58d09bdd25.png)

- Open Liberty Tools ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467288/0d7464d9-cbd5-13a4-c09f-040c41e86fdb.png)

#pom.xmlの変更

webアプリ用のpom.xmlにOpen Liberty Toolsへの`build`依存を追加します。

```xml
    <build>
        <plugins>
            <plugin>
                <groupId>io.openliberty.tools</groupId>
                <artifactId>liberty-maven-plugin</artifactId>
                <version>3.4</version>
            </plugin>            
        </plugins>
    </build>
```
liberty-maven-pluginが追加されているプロジェクトを自動スキャンして、LIBERTY DEV DASHBOARDにそのアプリが表示されます。
![スクリーンショット 2021-09-09 13.53.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467288/1b2b9f0a-f67b-9a70-d1f2-1b6ad8bef90e.png)
ワークスペース全ファイルをスキャンしているためか、ここになかなか対象アプリが表示されない場合があります。

#server.xmlの用意

Libertyの設定を行うserver.xmlは`src > main > liberty > config > server.xml`に配置します。こちらのファイルもホットデプロイ対象です。こちらのファイルを編集して、Libertyのfeatureの編集やその他依存ライブラリーを定義します。以下はその一例です。

```xml
<server description="new server">
    <!-- Enable features -->
    <featureManager>
        <feature>webProfile-8.0</feature>
        <feature>localConnector-1.0</feature>
    </featureManager>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>
                  
    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>

    <!-- Default SSL configuration enables trust for default certificates from the Java runtime --> 
    <ssl id="defaultSSLConfig" trustDefaultCerts="true"/>

    <jdbcDriver id="db2-driver-local" libraryRef="db2-library-local"/>
    <library id="db2-library-local">
        <fileset dir="C:\temp\db" id="db2-fileset-local" includes="db2jcc4.jar"/>
    </library>
    <dataSource id="db2-SQL Database-local" jdbcDriverRef="db2-driver-local" jndiName="jdbc/defaultDS" statementCacheSize="30" transactional="true">
        <properties.db2.jcc databaseName="BLUDB" password="yourPassword" portNumber="50000" serverName="yourServer" translateForBitData="2" user="user"/>
    </dataSource>
    <logging traceFileName="stdout" traceFormat="BASIC" traceSpecification="eclipselink.sql=all"/>
    <applicationMonitor updateTrigger="mbean"/>
</server>
```

#Open Liberyの起動

LIBERTY DEV DASHBOARDの対象アプリを右クリックしてstartを実行します。初回時に、Open Liberyの最新版をダウンロードして自動セットアップされます。
![スクリーンショット 2021-09-09 14.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467288/14dc6b60-7915-0bf8-2224-f328c93f0cc6.png)

起動が完了すると、localhost:9080　にアクセスしてみましょう。ちゃんと自分のwebアプリがローカルで稼働していることが確認できます。


#デバッグの実施

VS Codeの「実行とデバッグ」から`lanch.json`によるデバッグ設定を表示し、以下のDebug Liberty部分を追加します。

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "java",
      "name": "Debug Liberty",
      "request": "attach",
      "hostName": "localhost",
      "port": 7777
    },
    {
      "type": "java",
      "name": "Launch Current File",
      "request": "launch",
      "mainClass": "${file}"
    }
  ]
}
```

左上の実行とデバッグのプルダウンより定義したDebug Libertyを選択し、その左の緑の▷を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467288/b988d817-ff65-3a7b-da93-766307f2e9c0.png)
コールスタック・ビューにLibertyサーバーのJavaのスレッドが見えたら成功です。自分のソースコードの開いて任意の場所にブレークポイントを設定して、アプリを呼び出してみましょう。変数の中身などもちゃんとデバッグモードで確認可能です。

#感想

VS Codeがちょっともっさりになりました。デバッグ含めて通常のJava サーバーサイド開発はできそうですが、なんか重いですね。