问题现象
当使用 java -jar
命令运行 Spring Boot 应用时,控制台输出的中文日志出现乱码:
2025-05-29 15:32:31.725+08:00 INFO 8852 --- [cheduled-task-2] p.points.task.TransferDataMappingTask : 浼犺緭鏁版嵁鏄犲皠浠诲姟鎵ц瀹屾垚
2025-05-29 15:32:47.442+08:00 INFO 8852 --- [cheduled-task-4] p.p.service.PointsHistorySyncService : 寮€濮嬪鐞嗗緟鍚屾鐨勭敤鎴风Н鍒?
特点:
- IDE 中运行正常
- 日志文件中文显示正常
- 仅控制台输出乱码
常见无效方案
网上流传的这些方法通常无效:
# ❌ 单独设置JVM参数
java -Dfile.encoding=UTF-8 -jar app.jar
# ❌ 只修改logback配置
<charset>UTF-8</charset>
# ❌ 只切换控制台编码
chcp 65001
终极解决方案
创建启动脚本 start.bat
:
@echo off
echo Starting Spring Boot Application...
REM 关键步骤1:切换控制台编码为UTF-8
chcp 65001
REM 关键步骤2:设置Java环境变量
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8
REM 启动应用
java -jar your-application.jar
pause
原理分析
为什么单独设置无效?
- 控制台编码问题:Windows CMD 默认使用 GBK 编码
- Java 参数优先级:直接设置的 JVM 参数可能被覆盖
- Spring Boot 编码处理:框架内部有自己的编码逻辑
为什么组合方案有效?
chcp 65001
:将控制台切换到 UTF-8 模式JAVA_TOOL_OPTIONS
:环境变量方式优先级更高console.encoding
:专门处理控制台输出编码
完整配置
1. 启动脚本(必需)
@echo off
chcp 65001
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8
java -jar app.jar
pause
2. logback.xml(可选优化)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<!-- 不设置charset,让系统自动处理 -->
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
评论区