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 源与目标版本 ✅ 必须设置
相关推荐
洛克大航海2 小时前
Ubuntu安装JDK与Maven和IntelliJ IDEA
ubuntu·jdk·maven·intellij idea
SimonKing2 小时前
继老乡鸡菜谱之后,真正的AI菜谱来了,告别今天吃什么的烦恼...
java·后端·程序员
假客套2 小时前
2025 FastExcel在Java的Maven项目的导出和导入,简单易上手,以下为完整示例
java·maven·fastexcel
有梦想的攻城狮2 小时前
Maven中的settings.xml文件配置详解
xml·java·maven·settings.xml
wearegogog1233 小时前
液压位置控制源代码实现与解析(C语言+MATLAB联合方案)
java·c语言·matlab
游坦之3 小时前
基于Java Swing的智能数据结构可视化系统 | 支持自然语言交互的AI算法助手
java·数据结构·交互
王嘉俊9253 小时前
设计模式--装饰器模式:动态扩展对象功能的优雅设计
java·设计模式·装饰器模式
循着风3 小时前
多种二分查找
java
努力也学不会java3 小时前
【Java并发】深入理解synchronized
java·开发语言·人工智能·juc