使用批处理BAT启动jar包显示乱码问题的意外解决过程

我编写了一个BAT脚本来启动认证微服务jar包,脚本如下:

@echo off

chcp 65001 >nul   
             
mode con cols=200 lines=2000
title feng-auth
color 0a

java -version >nul 2>&1
if %errorlevel% neq 0 (
    echo not found Java env, please first install JDK or JRE.
    pause
    exit /b 1
)

if not exist "target\feng-auth.jar" (
    echo error: not found file target\feng-auth.jar。
    pause
    exit /b 1
)

java -Dfile.encoding=UTF-8 -Xmx256m -Xms128m -jar "target\feng-auth.jar"

pause

启动后运行还是正常的,当然启动过程没有输出中文,所以没有乱码:

我运行以下脚本来测试认证服务,从认证服务获取token等信息:

脚本输出为:

这时候查看feng-auth的窗口,看报了什么错:

2026-02-22 11:12:20.113 ERROR 17004 --- [io-11100-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

feign.FeignException$FeignClientException: [424] during [GET] to [http://feng-user3-biz/ump/app/credential/key/DEVICE_MGMT_PLATFORM] [RemoteAppCredentialService#getAppCredentialByAppKey(String)]: [{"code":1,"msg":"璇锋眰浠ょ墝宸茶繃鏈?,"data":"Full authentication is required to access this resource"}]
        at feign.FeignException.clientErrorStatus(FeignException.java:265)
        at feign.FeignException.errorStatus(FeignException.java:223)

可是有乱码!!!

这时候我强迫症犯了,要解决这个乱码问题,哪知半个小时过去了,还是没有解决。过程不想说了,太累了,心累,体力耗尽。


你猜最后怎么解决的!!!

我就直接说答案了,估计大多数人都想不到。

1、把脚本编码改为UTF-8 BOM

我的启动脚本名称为startup.bat,我使用notepad++查看编码为UTF-8,看不出任何问题,后来无意中修改为UTF-8 BOM,问题居然解决了。

2、于是,我加了注释提醒自己,脚本修改为:

@echo off
REM 注意文件编码要设置为 UTF-8 BOM,否则会显示中文乱码

REM 设置控制台为 UTF-8 编码,避免中文乱码(如果系统默认不是 UTF-8)
chcp 65001 >nul   
             
mode con cols=200 lines=2000
title feng-auth
color 0a

REM 检查 Java 环境
java -version >nul 2>&1
if %errorlevel% neq 0 (
    echo 未找到 Java 运行环境,请先安装 JDK 或 JRE。
    pause
    exit /b 1
)

REM 检查目标 JAR 文件是否存在
if not exist "target\feng-auth.jar" (
    echo 错误:找不到 target\feng-auth.jar 文件。
    pause
    exit /b 1
)

REM 启动应用(注意 JVM 参数必须放在 -jar 之前)
java -Dfile.encoding=UTF-8 -Xmx256m -Xms128m -jar "target\feng-auth.jar"

pause

但是再次运行,居然注释也能显示。

这个问题还是要解决的,免得继续工作也是心痒痒的。

于是,我猜测是编码修改时有看不见的乱码,所以我把第二行的注释移到第一行,并在前面加一行空行。

再次运行,注释不再显示。

最后分享这个微服务启动脚本的PowerShell版本,只需把第6行服务名称修改了就可以启动其他服务,复用很方便,希望有人能够用得上:

<#
注意文件编码要设置为 UTF-8 BOM,否则会显示中文乱码
#>

# ========== 可配置变量 ==========
$serviceName = "feng-auth"           # 服务名称(用于标题、提示和 JAR 文件名)
$jarPath = "target\$serviceName.jar" # JAR 文件路径
$jvmArgs = @(                        # JVM 参数数组(易修改)
    '-Dfile.encoding=UTF-8',
    '-Xmx256m',
    '-Xms128m'
)
# ================================

# 设置控制台编码为 UTF-8
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

# 设置窗口标题
$Host.UI.RawUI.WindowTitle = $serviceName

# 设置缓冲区大小(宽度200,高度2000)
$Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size(200, 2000)

# 设置窗口大小(宽度200,高度50,可根据屏幕调整)
$Host.UI.RawUI.WindowSize = New-Object Management.Automation.Host.Size(200, 50)

# 设置颜色(黑底绿字)
$Host.UI.RawUI.ForegroundColor = "Green"
$Host.UI.RawUI.BackgroundColor = "Black"
Clear-Host

# 检查 Java 环境
java -version 2>&1 | Out-Null
if ($LASTEXITCODE -ne 0) {
    Write-Host "未找到 Java 运行环境,请先安装 JDK 或 JRE。"
    Write-Host "按任意键继续..." -NoNewline
    $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    exit 1
}

# 检查目标 JAR 文件是否存在
if (-not (Test-Path $jarPath)) {
    Write-Host "错误:找不到 $jarPath 文件。"
    Write-Host "按任意键继续..." -NoNewline
    $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    exit 1
}

# 启动应用(使用展开的 JVM 参数)
Write-Host "启动 $serviceName 应用..."
java $jvmArgs -jar $jarPath

# 暂停
Write-Host "按任意键继续..." -NoNewline
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

为什么要用这个脚本启动呢?

  • 在Windows环境下启动feng-auth后台服务而设计,窗口标题就是服务名,方便多个服务启动后识别区分。
  • 自动将控制台编码统一为UTF-8,并提示脚本保存为带BOM的UTF-8格式,从根本上杜绝了中文乱码问题,确保日志和提示信息清晰可读。
  • 脚本对运行环境进行了全面检查:通过检测Java命令的退出码验证JDK/JRE是否已正确安装,并确认目标JAR文件是否存在,若任一条件不满足,会给出明确错误提示并安全退出,避免因环境缺失导致的启动失败。
  • 人性化地调整了控制台窗口的尺寸、颜色,使输出界面整洁专业。
  • 相较于传统的批处理文件,PowerShell版本拥有更强的编码控制能力、更丰富的错误处理机制,并且易于扩展和维护,为后续的功能增强奠定了良好基础。

完美!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值