问题现象
在 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 版本。
操作步骤
- 打开 IDEA 设置:
File → Settings → Build, Execution, Deployment → Build Tools → Maven → Runner - 在 VM Options 输入框中添加以下参数:
-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 - 点击 Apply → OK
- 重新运行 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 项目自动生效 |
| 维护成本 | 高 | 低,一次配置永久生效 |
验证方法
配置完成后,可以通过以下方式验证编码是否生效:
- 在 IDEA 中执行 Maven 编译,观察中文输出是否正常
- 执行以下命令查看当前 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 版本通用,无副作用,省心省力。