我编写了一个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版本拥有更强的编码控制能力、更丰富的错误处理机制,并且易于扩展和维护,为后续的功能增强奠定了良好基础。
完美!!!

3759

被折叠的 条评论
为什么被折叠?



