彻底解决 JDK 18+ IDEA Maven 编译中文乱码问题

2025年 阅读约 14 分钟 开发教程 · 后端开发

适用场景:IDEA 中使用 Maven 编译项目时,控制台输出中文显示为乱码,且项目使用 JDK 18 或更高版本。

问题现象

在 IDEA 中执行 Maven 编译(如 mvn clean compile)时,控制台输出的中文日志全部变成乱码:

[INFO] /D:/work/code/test/src/main/java/cn/jptool/framework/biz/demo/service/DemoCategoryService.java: �й���ϸ��Ϣ, ��ʹ�� -Xlint:unchecked ���±��롣
[INFO] ijЩ��Ϣ�Ѿ�����; ��ʹ�� -Xdiags:verbose ���±����Ի���������

明明 IDEA 的编码设置已经是 UTF-8,为什么还会乱码?

问题根源

从 JDK 18 开始,Java 官方修改了一个关键默认行为:

  • JDK 8~17:System.out 和 System.err 的默认编码跟随系统区域设置(Windows 中文系统通常是 GBK)
  • JDK 18+:System.out 和 System.err 的默认编码改为跟随 file.encoding 属性,而 file.encoding 默认值在 Windows 上变成了 UTF-8

这听起来像是好事,但实际上导致了编码不一致:

  • IDEA 控制台期望接收 UTF-8 编码的输出
  • Maven 进程在 JDK 18+ 下默认输出 UTF-8 编码
  • 但 IDEA 和 Maven 之间的管道通信可能仍然按旧方式处理,导致编码不匹配

更准确地说,JDK 18 引入了两个新参数:

  • -Dstdout.encoding
  • -Dstderr.encoding

这两个参数专门控制标准输出和错误输出的编码。如果它们没有被显式设置,在某些场景下(如 IDEA 内嵌 Maven 运行)会出现编码协商问题,导致乱码。

推荐方案:IDEA Maven Runner 全局 VM Options

这是最彻底、最省心的方法,所有 Maven 项目都不会再乱码,且兼容所有 JDK 版本。

操作步骤

  1. 打开 IDEA 设置:
    File → Settings → Build, Execution, Deployment → Build Tools → Maven → Runner
  2. 在 VM Options 输入框中添加以下参数:
    -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8
  3. 点击 Apply → OK
  4. 重新运行 Maven 编译命令,乱码立即消失

为什么这三个参数可以跨版本通用?

核心原因是 JVM 会自动忽略它不认识的 VM 参数,不会报错,也不会影响运行。

参数 JDK 8~17 行为 JDK 18+ 行为
-Dfile.encoding=UTF-8 ✅ 生效(解决乱码的核心参数) ✅ 生效(控制文件读写编码)
-Dstdout.encoding=UTF-8 ❌ 被自动忽略(JDK 18 才引入) ✅ 生效(控制标准输出编码)
-Dstderr.encoding=UTF-8 ❌ 被自动忽略(JDK 18 才引入) ✅ 生效(控制错误输出编码)
  • 用 JDK 8 时:相当于只设置了 -Dfile.encoding=UTF-8,这正是 JDK 8 解决 Maven 中文乱码需要的唯一且正确的参数
  • 用 JDK 18+ 时:三个参数全部生效,完美解决了 JDK 官方修改控制台编码默认行为带来的新问题

其他方案对比

方案 2:修改 pom.xml(项目级)

在每个项目的 pom.xml 中添加:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

缺点:每个项目都要单独配置,繁琐且容易遗漏。

方案 3:修改 idea64.exe.vmoptions(不推荐)

在 IDEA 安装目录的 bin/idea64.exe.vmoptions 中添加:

-Dfile.encoding=UTF-8

缺点:

  • 可能导致 IDEA 本身界面乱码
  • IDEA 升级后配置可能被覆盖
  • 影响 IDEA 所有进程,范围过大

方案 4:设置系统环境变量 JAVA_TOOL_OPTIONS(不推荐)

JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8

缺点:

  • 影响电脑上所有 Java 程序的运行
  • 某些程序可能因此出现编码问题
  • 全局副作用不可控

方案 5:修改 Windows 系统区域设置为 UTF-8(不推荐)

控制面板 → 区域 → 管理 → 更改系统区域设置 → 勾选 "Beta 版: 使用 Unicode UTF-8 提供全球语言支持"

缺点:

  • 可能导致某些老旧的中文软件出现乱码
  • 系统级改动,风险较大
  • 需要重启电脑

为什么推荐 IDEA Maven Runner VM Options 方案?

对比维度 旧方案 本方案
作用范围 全局,影响所有 Java 程序 仅 IDEA 内部运行的 Maven 进程
副作用 可能导致 IDEA 本身或其他程序乱码 不影响 IDEA 本身,不影响其他 Java 程序
JDK 兼容性 切换 JDK 版本时需要来回修改配置 跨所有 JDK 版本通用,无需切换
项目配置 每个项目可能需要单独处理 所有 Maven 项目自动生效
维护成本 高 低,一次配置永久生效

验证方法

配置完成后,可以通过以下方式验证编码是否生效:

  1. 在 IDEA 中执行 Maven 编译,观察中文输出是否正常
  2. 执行以下命令查看当前 Maven 进程的编码设置:
    mvn help:system | findstr encoding

    输出中应包含:

    file.encoding = UTF-8
    stdout.encoding = UTF-8
    stderr.encoding = UTF-8

总结

JDK 版本 推荐配置
JDK 8~17 -Dfile.encoding=UTF-8 即可
JDK 18+ -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8
跨版本通用 -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 ✅

最佳实践:直接在 IDEA Maven Runner 的 VM Options 中配置三个参数,一次设置,所有项目、所有 JDK 版本通用,无副作用,省心省力。