Maven忽略UTF-8编码参数使用Cp1252致数据库特殊字符乱码
解决Maven命令执行时Flyway迁移乱码(cp1252转UTF-8)问题
针对IntelliJ运行JUnit测试时德语变音字符显示正常,但执行Maven命令链时编码变为cp1252导致乱码的问题,可按以下步骤排查解决:
1. 强制Maven全局JVM使用UTF-8编码
project.build.sourceEncoding仅控制编译阶段的文件编码,JVM运行时的file.encoding仍可能继承系统默认值(Windows下为cp1252)。需在命令行直接指定JVM编码参数:
mvn clean verify jacoco:report sonar:sonar -Dproject.build.sourceEncoding=UTF-8 -Dproject.reporting.outputEncoding=UTF-8 -Dfile.encoding=UTF-8
也可在settings.xml(全局或用户级)中配置全局JVM参数,避免重复输入:
<profiles> <profile> <id>utf8</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <file.encoding>UTF-8</file.encoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-Dfile.encoding=UTF-8</argLine> </configuration> </plugin> </plugins> </build> </profile> </profiles>
2. 配置JUnit测试阶段的JVM编码
spring-boot-maven-plugin的jvmArguments仅作用于打包后的应用启动,测试阶段的JVM参数需单独配置maven-surefire-plugin:
在pom.xml的<build><plugins>中添加:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <argLine>-Dfile.encoding=UTF-8</argLine> <!-- JUnit 5环境下添加此项确保参数生效 --> <forkCount>1</forkCount> <reuseForks>false</reuseForks> </configuration> </plugin>
3. 验证Flyway迁移脚本的文件编码
确保所有.sql迁移脚本以UTF-8无BOM格式保存:
- 在IntelliJ中右键脚本文件 →
File Encodings,确认编码为UTF-8,若存在BOM则勾选Remove BOM。 - 避免脚本被编辑器默认保存为系统编码(cp1252),否则即使Flyway配置了编码,读取文件仍会乱码。
4. 数据库连接URL指定UTF-8编码
确保应用与数据库的连接传输使用UTF-8,在application.properties或application.yml中修改数据库URL:
- MySQL:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false - PostgreSQL:
spring.datasource.url=jdbc:postgresql://localhost:5432/your_db?client_encoding=UTF8
5. 系统环境变量全局配置(可选)
Windows系统中,设置环境变量强制所有Java进程使用UTF-8:
- 添加系统环境变量
JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 - 重启控制台后执行Maven命令,确保环境变量生效
内容的提问来源于stack exchange,提问作者DerSilver
相关产品推荐
相关产品推荐

