Maven编译编码需在maven-compiler-plugin中显式配置:设UTF-8、启用fork时加-J-Dfile.encoding=UTF-8、统一版本,并配合等全局属性及surefire插件的argLine确保全流程UTF-8。

核心是让 Maven 编译器插件明确知道该用什么编码读源码、生成字节码、输出日志。光靠 IDE 设置或系统编码远远不够,必须在 maven-compiler-plugin 中做针对性配置。
指定源码编码与编译器参数
在 pom.xml 的 <build><plugins></plugins></build> 下添加或修改编译插件配置:
-
强制源文件按 UTF-8 解析:设置
<encoding>UTF-8</encoding>,避免 Windows 默认 GBK 误读 UTF-8 源文件 -
启用 fork 并传入 JVM 编码参数:当使用
<fork>true</fork>(常见于 JDK 17+)时,必须显式加-J-Dfile.encoding=UTF-8到<compilerargs></compilerargs>,否则子 JVM 会沿用系统默认编码(如 Windows 的 Cp1252 或 GBK),导致错误信息乱码 -
统一 Java 版本声明:用
<source></source>和<target></target>明确版本,避免隐式降级引发编码兼容问题
适配 Surefire 测试输出乱码
测试中 System.out.println("中文") 乱码,不是编译问题,而是测试运行时 JVM 编码不对。需单独配置 maven-surefire-plugin:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 在插件
<configuration></configuration>中添加<argline>-Dfile.encoding=UTF-8</argline> - 不要只依赖
project.build.sourceEncoding,它不影响测试进程的 JVM 启动参数 - 若用 JUnit 5 + JDK 21,建议同时加
--add-opens参数防模块限制,但必须确保它们和-Dfile.encoding在同一argLine中
防止编译警告/错误信息变乱码
添加插件参数后,原本清晰的中文报错(如“找不到符号 HttpServletRequest”)变成“: HttpServletRequest”,说明编译子进程编码失效:
立即学习“Java免费学习笔记(深入)”;
- 确认
<compilerargs></compilerargs>中已包含-J-Dfile.encoding=UTF-8(注意开头的-J,表示传递给 fork 的 JVM) - 检查是否误写成
-Dfile.encoding=UTF-8(没加-J),这只会作用于 Maven 主进程,对编译器子进程无效 - Windows 用户可配合
chcp 65001确保控制台本身支持 UTF-8 渲染
配套基础编码声明不能少
插件配置再准,也得有全局编码锚点支撑:
- 在
<properties></properties>中设<project.build.sourceencoding>UTF-8</project.build.sourceencoding> - 加上
<project.reporting.outputencoding>UTF-8</project.reporting.outputencoding>,保证生成的 site 报告不乱码 - 避免混用
maven.compiler.encoding(旧版属性),优先用插件内<encoding></encoding>

















