Windows+Java 21+VS Code+Liberty Toolsで発生するターミナルの文字化けを直す

Windows環境のVisual Stdio Codeで，Java 21を使用してLibertyのMavenプロジェクトをビルドしたら，激しく文字化けしました。Java 18以降で，いろいろな所の文字コードのデフォルトがUTF-8になった影響でしょう。

![encoding_mismatch1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60041/910239df-2e23-d0fa-44e6-d075a84fe69e.png)

修正方法をメモ

# ターミナルで実行するPowerShellのコードページを変更

VS Codeのターミナルでは，cmdとかWSLとかいろいろなものが起動できますが，PowerShellがおすすめです。最新のPowerShellが導入されていなければ，こちらからダウンロードして入れておきましょう。

https://aka.ms/pscore6

VS Codeで，メニューの「ファイル」から「ユーザー設定」「設定」で設定画面を開きます。キーボードから`Ctrl+,`でも開きます。

![encoding_mismatch3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60041/b31a26e2-a41e-6e18-6d74-abfac7a62cca.png)

設定画面の右上の「設定(JSON)を開く」ボタンをクリックします。

![encoding_mismatch4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60041/ec125520-e959-0e2a-a242-f00316c16038.png)

JSONを編集して`terminal.integrated.defaultProfile.windows`と`terminal.integrated.profiles.windows`の設定を追加します。

```json:settings.json
{
    "redhat.telemetry.enabled": true,
    // ターミナルでデフォルトで開くプログラムをPowerShellに指定
    "terminal.integrated.defaultProfile.windows": "PowerShell",
    // PowerShellをUTF-8（Code Page 65001）で起動
    "terminal.integrated.profiles.windows": {
        "PowerShell": {
            "source": "PowerShell",
            "args": [
                "-NoExit",
                "-Command",
                "chcp 65001"
            ],
        }
    }
}
```

ファイルを保存したら，開いているターミナルをすべて`exit`で閉じ，VS Codeを終了して再起動します。残っているターミナルがあると，再起動時に前回の構成で復帰しようとするので文字化けが直りません。

これでMavenからのUTF-8の出力が正常に表示されるようになります。

# Libertyの出力をUTF-8に変更

これだけだとLibertyからMavenへの出力がMS932のままなので，そこの部分が文字化けします。Mavenから起動したLibertyの出力をUTF-8に変更するには，`liberty-maven-plugin`を組み込んだ`pom.xml`の`<properties>`に ~~以下の2行を追記します。~~

```xml:pom.xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 以下の2行を追加 -->
    <liberty.jvm.arg1>-Dstdout.encoding=UTF-8</liberty.jvm.arg1>
    <liberty.jvm.arg2>-Dstderr.encoding=UTF-8</liberty.jvm.arg2>
    <!-- 追加ここまで -->
</properties>
```

コンソール出力の文字コードの変更は，Java 18では`sun.stdout.encoding`とかだったと思うのですが，Java 21では`stdout.encoding`とかになってました。

~~これで文字化けせずにLiberty Toolsからビルドができるようになります。~~

**2023/11/30追記** これだと，`src/main/liberty/config`にある`jvm.options`が上書きされてしまいます。プロファイルを設定して，状況によって切り替えた方がいいですね。

加えて，対称性のために`jvm.options`は，ファイルをsrcに用意するのではなく，pom.xmlのプロパティで設定するようにしてください。

``` xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<profiles>
    <profile>
        <id>for-dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <liberty.jvm.maxHeap>-Xmx512m</liberty.jvm.maxHeap>
            <liberty.jvm.stdout>-Dstdout.encoding=UTF-8</liberty.jvm.stdout>
            <liberty.jvm.stderr>-Dstderr.encoding=UTF-8</liberty.jvm.stderr>
        </properties>
    </profile>
    <profile>
        <id>package</id>
        <properties>
            <liberty.jvm.maxHeap>-Xmx2048m</liberty.jvm.maxHeap>
        </properties>
    </profile>
</profiles>
```

通常通り，Mavenを起動すると，`for-dev`プロファイルに設定したJVMパラメーターが有効になります。

```terminal
$ mvn liberty:dev
```

`-Ppackage`をつけてMavenを起動すると，`package`プロファイルに設定したものが有効になります。

```terminal
$ mvn package -Ppackage
```