根本原因是源文件为UTF-8编码而javac默认用GBK读取;必须在build.gradle中配置tasks.withType(JavaCompile) { options.encoding = "UTF-8" },该设置显式指定编译器读源码编码,覆盖系统locale fallback,且需配合IDE三处编码设为UTF-8并重启生效。

Gradle Java 编译时出现中文乱码(比如 javac 报“非法字符”或注释/字符串显示为 ???),根本原因只有一个:源文件是 UTF-8 编码,但 javac 默认用系统编码(Windows 下常为 GBK)去读取它。不是 IDEA 显示问题,也不是控制台输出问题——编译阶段就失败了。
build.gradle 中必须配置 JavaCompile.encoding
这是最直接、最有效的修复点。Gradle 不会自动继承 IDEA 的文件编码设置,javac 启动时若未显式指定 -encoding,就会 fallback 到系统 locale 编码。
-
tasks.withType(JavaCompile) { options.encoding = "UTF-8" }是最低要求,必须加 - 如果用 Kotlin DSL(
build.gradle.kts),写成tasks.withType<javacompile> { options.encoding = "UTF-8" }</javacompile> - 不要只配
compileJava任务——它只是别名,withType(JavaCompile)才能覆盖所有 Java 编译任务(包括测试编译) - 这个配置只影响编译器读源码的编码,和运行时无关;即使你后续加了
-Dfile.encoding,没这行照样报错
IDEA 的 File Encoding 设置只是表象
右下角显示 UTF-8 只代表 IDEA 当前以 UTF-8 解析文件,并不改变 Gradle 构建行为。很多人改完这里仍乱码,就是因为没动 build.gradle。
- 确保
File → Settings → Editor → File Encodings中三处都设为UTF-8:Global Encoding、Project Encoding、Default encoding for properties files - 但注意:改完后需重启 IDEA,且已有文件可能需要手动
Reload project from disk或重新打开,否则缓存仍按旧编码解析 - 如果项目是从 SVN/Git 拉下来的,检查 .gitattributes 是否强制设置了
* text=auto eol=lf,避免换行符干扰编码识别
不要依赖 -Dfile.encoding 解决编译乱码
网上大量教程让加 -Dfile.encoding=UTF-8 到 VM Options,这对 JavaExec 或 Test 任务有用,但对 JavaCompile 完全无效——javac 不读这个 JVM 参数。
立即学习“Java免费学习笔记(深入)”;
-
javac唯一认的编码参数是-encoding,对应 Gradle 的options.encoding -
-Dfile.encoding影响的是Charset.defaultCharset(),即new String(bytes)或Files.readAllLines()等 API 的默认行为,不是编译器 - 如果你在
build.gradle里同时写了options.encoding和jvmArgs += "-Dfile.encoding=UTF-8",后者对编译无意义,纯属冗余
Windows 下还需留意控制台活动代码页
即使编译通过,运行时控制台仍可能乱码,尤其当你用 gradle run 或 JavaExec 启动主类时。这是因为 Windows 控制台默认用活动代码页(chcp 查看)解释输出字节流。
- 临时解决:在 CMD 中先执行
chcp 65001,再跑gradle run - 长期解决:在
build.gradle中给JavaExec加系统属性:systemProperty "file.encoding", "UTF-8",并确保终端本身支持 UTF-8(Win10+ 建议启用「Beta: 使用 Unicode UTF-8 提供全球语言支持」) - 注意:PowerShell 默认不尊重
chcp,它的显示编码由$OutputEncoding控制,需额外设为[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
真正容易被忽略的点是:编译乱码和运行乱码是两个独立问题,分别由 javac -encoding 和 System.out 输出通道决定。混在一起调,十次有九次白忙活。


















