Java21 + Windowsにおける文字化け対策の設定のまとめ

2024/07/27に公開

Java21 + Windowsにおける文字化け対策の設定について整理しました。
Java8についてはこちら

以下のリポジトリに作成したMarkdownからの抜粋です。
https://github.com/leoninja256/java-garbled-verification

もっと簡単な方法があればコメント頂けると助かります!

前提条件

  • ソースコード、コンパイル時のエンコーディングはUTF-8とする
  • 実行時のfile.encodingはUTF-8とする

ソフトウェアバージョン

ソフトウェア バージョン
Oracle JDK 21.0.3+7-LTS-152
Gradle (wrapper) 8.8
Maven (wrapper) 3.9.6
IntelliJ IDEA 2024.1.4
Eclipse (Pleiades) 4.32.0
Windows 11 Pro 22631.3810
cmd 22631.3810
Windows PowerShell 5.1.22621.3810
PowerShell 7 7.4.3

結論

Java21の場合は以下を設定しておく。

※wrapperで起動した際にchcp 65001させることで解決した。
 wrapperのバッチファイルはコミット対象のファイルなのでメンバーに簡単に設定を共有できる。
※Gradleはかなり面倒……。

Gradle

  • gradle.properties
    org.gradle.jvmargs=-Dfile.encoding=UTF-8
    
  • build.gradle.kts
    val encodingJvmArgs = listOf(
        "-Dfile.encoding=UTF-8",
        "-Dsun.stdout.encoding=UTF-8",
        "-Dsun.stderr.encoding=UTF-8",
        "-Dstdout.encoding=UTF-8",
        "-Dstderr.encoding=UTF-8",
    )
    
    tasks.withType<JavaExec> {
        // JavaExec型のタスクのVM引数にエンコーディング関連のプロパティを追加する
        jvmArgs(encodingJvmArgs)
    }
    
    tasks.withType<JavaCompile> {
        options.encoding = "UTF-8"
    }
    
    tasks.javadoc {
        options.encoding = "UTF-8"
    }
    
    tasks.test {
        // テスト時のVM引数にエンコーディング関連のプロパティを追加する
        jvmArgs(encodingJvmArgs)
        ...
    }
    
    tasks.wrapper {
        // gradlew.batの先頭に"chcp 65001"を追加する
        // powershellの場合もgradlew.batから実行する限りはこれで対応できる
        doLast {
            val charset = Charset.forName("MS932")
            val gradlewBat = file("gradlew.bat")
            gradlewBat.writeText("@echo off & chcp 65001 & @echo on\r\n" + gradlewBat.readText(charset), charset)
        }
    }
    
  • gradlew.bat
    @echo off & chcp 65001 & @echo on
    @rem
    @rem Copyright 2015 the original author or authors.
    ...
    

Maven

  • .mvn/jvm.config
    -Dfile.encoding=UTF-8
    
  • pom.xml
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.1.2</version>
                    <configuration>
                        <argLine>-Dfile.encoding=UTF-8</argLine>
    
  • mvnw.cmd
    <# : batch portion
    @echo off & chcp 65001 & @echo on
    @REM ----------------------------------------------------------------------------
    ...
    

IntelliJ IDEA

  • IntelliJ IDEA - VMカスタムオプション
    • -Dfile.encoding=UTF-8

Eclipse

  • Eclipse - eclipse.ini
    • -Dfile.encoding=UTF-8

検証内容のログ

以下のリポジトリのjava21.mdをご確認ください。
https://github.com/leoninja256/java-garbled-verification/blob/main/java21.md

以上。

Discussion