Windows環境のVisual Stdio Codeで,Java 21を使用してLibertyのMavenプロジェクトをビルドしたら,激しく文字化けしました。Java 18以降で,いろいろな所の文字コードのデフォルトがUTF-8になった影響でしょう。
修正方法をメモ
ターミナルで実行するPowerShellのコードページを変更
VS Codeのターミナルでは,cmdとかWSLとかいろいろなものが起動できますが,PowerShellがおすすめです。最新のPowerShellが導入されていなければ,こちらからダウンロードして入れておきましょう。
VS Codeで,メニューの「ファイル」から「ユーザー設定」「設定」で設定画面を開きます。キーボードからCtrl+,
でも開きます。
設定画面の右上の「設定(JSON)を開く」ボタンをクリックします。
JSONを編集してterminal.integrated.defaultProfile.windows
とterminal.integrated.profiles.windows
の設定を追加します。
{
"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行を追記します。
<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