LoginSignup
3
1

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

Last updated at Posted at 2023-11-21

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

encoding_mismatch1.png

修正方法をメモ

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

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

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

encoding_mismatch3.png

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

encoding_mismatch4.png

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

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行を追記します。

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のプロパティで設定するようにしてください。

<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パラメーターが有効になります。

$ mvn liberty:dev

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

$ mvn package -Ppackage
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1