IDEA中Maven打包中文乱码修复(AI生成)

步骤二:根治——关闭 maven.use.scripts 注册项

这是绕过 cmd.exe 套壳、让 IDEA 回归直接调用 java.exe 的最干净解法,全链路保持 UTF-8,不用向 GBK 妥协 CSDN

  1. 在 IDEA 界面连按两下 Shift 键,打开全局搜索(Search Everywhere)。
  2. 切到 Actions 选项卡,输入 Registry...(描述为 "Access internal IDE settings and features"),回车打开。
  3. 在长列表顶部的过滤框里直接键入 maven.use.scripts 定位该项。
  4. 取消该项右侧的复选框勾选(即设为 false / Disable)。
  5. 完全重启 IDEA 后再次执行构建,控制台中文即可回归正常 UTF-8 显示。

该开关关闭后,IDEA 直接使用你配置的 Maven 主程序(Bundled 或自定义 MAVEN_HOME),跳过 mvn.cmd 脚本,从而避开 cmd.exe 的 GBK 管道 CSDN。这只改变执行方式,不影响 Maven 的构建结果与功能。若你的项目依赖 Maven Wrapper(mvnw)或有公司策略限制不能动 Registry,可保留该项开启,改用步骤三/四。

步骤三:配置 Runner 的 VM Options(推荐优于环境变量)

无论是否关闭 maven.use.scripts,都应保证 Maven 运行时的 JVM 编码与项目一致。这一步是 2026.1.4 上最通用的配置。

打开 File → Settings → Build, Execution, Deployment → Build Tools → Maven → Runner,在 VM Options 输入框填入 cnblogs CSDN

code
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -Duser.language=zh -Duser.country=CN

各参数的作用需分开理解:-Dfile.encoding 控制 JVM 默认字符编码,决定 new String()InputStreamReader 等无显式编码时的解码方式;-Dsun.jnu.encoding 影响文件名/路径编码,对含中文路径(如 D:\我的项目)的工程尤其关键,否则资源拷贝阶段会报找不到文件;-Dstdout.encoding-Dstderr.encoding 是 JDK 18+ 引入的独立标准流编码开关,能覆盖部分插件直接写 System.out 时仍乱码的边缘场景;-Duser.language-Duser.country 让 JVM 按 zh_CN 区域输出日志,避免部分插件按系统默认区域吐出其他编码。

之所以推荐把参数写在 VM Options 而非环境变量里,是因为在 2026.1.4 上实测发现:用环境变量 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 虽然能让中文正常,但 Maven 每构建一个模块都会输出一行红色的 Picked up JAVA_TOOL_OPTIONS: ... 提示,干扰日志阅读;而写在 VM Options 里则不会产生这条冗余提示 CSDN

步骤四:环境变量 JAVA_TOOL_OPTIONS 兜底(Wrapper 或外部 Maven 场景)

如果你使用 Maven Wrapper(mvnw)或在系统终端直接跑 mvn,Runner 的 VM Options 可能被绕过,此时需要用环境变量做系统级兜底 掘金

仍在 Maven → RunnerEnvironment variables 里新增一项,根据评论区补充,完整值应包含标准流编码才能彻底解决 CSDN

code
JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8

JAVA_TOOL_OPTIONS 是 JVM 启动时无条件读取的全局兜底开关,优先级高于 mvn.cmd 内部的默认设置,因此对新版 cmd.exe /c 套壳场景有效。缺点就是前面提到的红色 Picked up 提示,所以在能用 VM Options 的场景下优先用步骤三。也可同时补充一个 MAVEN_OPTS 用于外部 Maven 或 CI:

code
MAVEN_OPTS=-Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dfile.encoding=UTF-8

步骤五:统一 IDEA 工程编码

仅改运行参数还不够,源码与资源处理阶段也可能产生乱码,需要从 IDE 层统一。打开 File → Settings,搜索 encoding,进入 Editor → File Encodings,把以下三项全部设为 UTF-8Global EncodingProject EncodingDefault encoding for properties files,并勾选 Transparent native-to-ascii conversion(针对 properties 文件的本地转 ASCII 透明转换)cnblogs

这一步解决的是编辑器层的编码:源码文件本身以什么字节序列存盘、properties 文件里的中文是否被转义为 \uXXXX。如果源码文件本身是 GBK 存盘的,再怎么调 JVM 参数也救不回来,所以必须先确保存盘编码正确。

步骤六:在 pom.xml 中声明编码并配置 surefire 插件

工程层需要显式声明编译与资源编码,避免 maven-compiler-pluginmaven-resources-plugin 阶段再乱码 CSDN

xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

特别地,如果你是在执行 mvn test 时遇到乱码,maven-surefire-plugin 是一个常被忽略的环节。该插件默认 fork 一个新的子 JVM 来跑测试,且其内部的 ConsoleOutputParser 会对输出流做二次解析,因此即使父 JVM 设了 UTF-8,子 JVM 仍可能继承 OS 的 GBK。必须显式声明 CSDN

xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
<systemPropertyVariables>
<file.encoding>UTF-8</file.encoding>
</systemPropertyVariables>
<redirectTestOutputToFile>false</redirectTestOutputToFile>
</configuration>
</plugin>

其中 redirectTestOutputToFile=false 是关键——若设为 true(部分模板默认值),测试输出会被重定向到文件再由插件读取,多一次编解码转换;设为 false 让输出直接走标准流,配合前面的 JVM 参数即可正确显示。

步骤七:Maven Wrapper 项目的 .mvn/jvm.config

如果项目根目录有 mvnw / mvnw.cmd,IDEA 会优先读取项目内 .mvn/jvm.config 中的 JVM 参数,上述 Runner 的 VM Options 可能被 Wrapper 脚本覆盖。此时需在项目根目录创建或编辑 .mvn/jvm.config,写入一行 CSDN

code
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -Duser.language=zh -Duser.country=CN

这是 Wrapper 模式下最容易被遗漏的一环,排查时务必确认该文件是否存在及其内容。

步骤八:清除缓存并重启验证

所有配置改完后,执行 File → Invalidate Caches… → Invalidate and Restart,让 IDEA 重新加载索引与配置。部分配置(尤其是 Registry 项与 VM Options)必须重启才生效,不清缓存可能仍看到旧乱码。

验证时可以在测试代码里打印一行来确认编码链路是否贯通 CSDN

java
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("stdout.encoding=" + System.getProperty("stdout.encoding"));
System.out.println("测试中文输出:你好,世界");

预期输出应为 file.encoding=UTF-8stdout.encoding=UTF-8 以及正常显示的中文。若 file.encoding 仍为 GBK,说明 JVM 参数未被读取到,需回查 VM Options 是否生效或 Wrapper 的 jvm.config 是否覆盖。

posted @ 2026-08-21 10:09  全琪俊  阅读(22)  评论(0)    收藏  举报