Maven 设置项目编码,防止编译打包出现编码错误

Maven 设置项目编码,防止编译打包出现编码错误

作者说明: 本文通过实际示例演示如何在 Maven 项目中正确设置编码,

避免中文源码或注释在编译、打包、测试时出现乱码或"不可映射字符"错误。
说明: 以下内容仅用于技术分享,如有侵权请联系删除。


🧩 一、为什么要设置编码

Java 源文件本身是文本文件,字符编码(如 UTF-8、GBK)决定了其中字符的存储方式。

如果源文件的实际编码与编译器使用的编码不一致,就会在编译时出现错误或乱码。

最常见的错误信息是:

复制代码
编码GBK的不可映射字符

这通常意味着:源码是 UTF-8 保存的,而 Maven 编译器却用 GBK 去解码。


⚙️ 二、正确的编码配置(推荐 UTF-8)

pom.xml 中,通过 <properties><build> 标签指定项目的统一编码:

xml 复制代码
<properties>
    <!-- 指定源代码使用的 Java 版本 -->
    <maven.compiler.source>8</maven.compiler.source>
    <!-- 指定生成的字节码目标版本 -->
    <maven.compiler.target>8</maven.compiler.target>
    <!--设置项目编译的字符编码为UTF-8--> 
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <!-- 设置项目源码的字符编码为 UTF-8 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 报告输出文件使用的编码(Maven 生成的站点、报告) -->
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

💡 说明:

  • <project.build.sourceEncoding>:控制编译时源码读取的编码。
  • <project.reporting.outputEncoding>:控制 Maven 生成报告文件的编码。
  • <encoding>maven-compiler-plugin 插件自身的编码设置。

🧠 三、验证 UTF-8 配置是否生效

1️⃣ 示例源码(UTF-8 编码)

文件:src/test/java/CodeTest.java

java 复制代码
import org.junit.Test;

public class CodeTest {
    @Test
    public void test() {
        System.out.println("你好");
    }
}

2️⃣ 编译与运行

bash 复制代码
PS D:\live\projects\IDEA\JDBC> mvn compile
PS D:\live\projects\IDEA\JDBC> mvn test -Dtest=CodeTest#test
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running CodeTest
你好
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec

✅ 可以看到测试输出正常显示中文"你好",说明编码配置正确。


🚫 四、错误示例(编码不一致:GBK)

如果我们错误地将项目的编码改为 GBK:

xml 复制代码
<properties>
    <!-- 指定源代码使用的 Java 版本 -->
    <maven.compiler.source>8</maven.compiler.source>
    <!-- 指定生成的字节码目标版本 -->
    <maven.compiler.target>8</maven.compiler.target>
    <!--设置项目编译的字符编码为UTF-8--> 
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <!-- 设置项目源码的字符编码为 UTF-8 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 报告输出文件使用的编码(Maven 生成的站点、报告) -->
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

然后重新编译:

bash 复制代码
PS D:\live\projects\IDEA\JDBC> mvn clean
PS D:\live\projects\IDEA\JDBC> mvn compile

输出:

复制代码
[WARNING] 编码GBK的不可映射字符

继续运行测试:

bash 复制代码
PS D:\live\projects\IDEA\JDBC> mvn test -Dtest=CodeTest#test

报错如下:

复制代码
[ERROR] /src/test/java/MybatisDemoTest.java:[17,17] 编码GBK的不可映射字符
[ERROR] /src/test/java/MybatisDemoTest.java:[43,56] 对于User(...), 找不到合适的构造器

📘 原因分析:

当源码实际是 UTF-8 编码,而 Maven 编译器认为是 GBK 时,

在编译阶段解码失败,部分字符损坏,

导致中文注释、变量名或字符串常量被错误解析,最终引发"不可映射字符"甚至"构造器签名不匹配"的编译错误。


🧩 五、关于 <project.reporting.outputEncoding>

该属性只影响 Maven 生成报告文件(如 site、plugin 报告) 的编码。

不会影响源码编译或程序运行。

建议统一设置为 UTF-8,保持整个项目的字符集一致性。


🧭 六、总结

场景 推荐设置
源码文件编码 UTF-8
Maven 编译器编码 <encoding>UTF-8</encoding>
报告输出编码 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
操作系统或 IDE 字符集 保持一致(UTF-8)

总结一句话:

Maven 编译时的字符编码必须与源码文件的实际编码一致。

推荐在 pom.xml 中统一使用 UTF-8,以确保跨平台构建和测试过程无乱码问题。


📚 附:常见 Maven 编码相关属性

属性名 作用 是否必须
project.build.sourceEncoding 编译源码时使用的编码 ✅ 推荐设置
maven.compiler.encoding 编译插件使用的编码参数 ✅ 可选
project.reporting.outputEncoding Maven 报告输出文件编码 ✅ 推荐设置
maven.compiler.source / target Java 源与目标版本 ✅ 必须设置
相关推荐
Json____23 分钟前
从零构建家政服务平台:一套全栈架构如何打通管理端与移动端-java-springboot
java·spring boot·后端·架构·毕设·wwwoop.com
云雀衔光1 小时前
Java Spring AI MCP:在 Spring 里把 AI 接上你的业务系统
java·开发语言·人工智能·后端·测试工具·spring
重生之小比特1 小时前
【Java SE】数据类型与变量
java·开发语言·python
苏渡苇1 小时前
Spring Insight 里如何对 Span 进行清洗
java·spring boot·后端·spring·系统监控
find1star1 小时前
LeetCode 54:螺旋矩阵——用四个边界模拟矩阵收缩
java·算法·leetcode·边缘计算·学习方法
Yeniden1 小时前
Java 后端从零到企业级:第1篇 Java 基础语法——变量、数据类型与运算符
java·开发语言·apache
邪修king1 小时前
Linux系统篇(二十三) 基础 IO:从“文件”到“文件描述符”,彻底理解重定向
android·java·linux
云雀衔光1 小时前
MCP + 应用生成:让 AI 直接产出可交互的应用
java·人工智能·测试工具·microsoft·交互·ai编程
Nuanyt1 小时前
JVM常见核心知识梳理02 类加载 字节码技术 双亲委派 Java内存模型 JMM 并发底层 volatile synchronized 常见排障与调优工具
java·开发语言·jvm
Shan12051 小时前
经典算法题示例与详解:飞地的数量(二)
java·数据结构·算法