Windows 下 jar 程序开机自启
假如有 java 应用程序:vitality-admin.jar。
关于 javaw
下面脚本中使用 javaw -jar vitality-admin.jar 的方式启动程序,意为后台启动,即不会出现命令提示符的黑窗口。
javaw 启动/停止脚本
启动脚本 vitality.bat,有如下执行命令:
bash
# 启动(vitality-admin.jar 和 vitality.bat 需要放在同一文件夹下。)
vitality.bat
# 然后需要键盘输入序号:1启动,2关闭,3重启,4启动状态,5退出
# 比如输入 1,就是启动的意思。
启动时,需要手动选择编号,1 启动,2 关闭,3 重启,4 启动状态,5 退出。
bash
rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码,可使用 windows 记事本设置编码。
@echo off
rem jar平级目录
set AppName=vitality-admin.jar
rem JVM参数
set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC"
ECHO.
ECHO. [1] 启动%AppName%
ECHO. [2] 关闭%AppName%
ECHO. [3] 重启%AppName%
ECHO. [4] 启动状态 %AppName%
ECHO. [5] 退 出
ECHO.
ECHO.请输入选择项目的序号:
set /p ID=
IF "%id%"=="1" GOTO start
IF "%id%"=="2" GOTO stop
IF "%id%"=="3" GOTO restart
IF "%id%"=="4" GOTO status
IF "%id%"=="5" EXIT
PAUSE
:start
for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
set pid=%%a
set image_name=%%b
)
if defined pid (
echo %%is running
PAUSE
)
start javaw %JVM_OPTS% -jar %AppName%
echo starting……
echo Start %AppName% success...
goto:eof
rem 函数stop通过jps命令查找pid并结束进程
:stop
for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
set pid=%%a
set image_name=%%b
)
if not defined pid (echo process %AppName% does not exists) else (
echo prepare to kill %image_name%
echo start kill %pid% ...
rem 根据进程ID,kill进程
taskkill /f /pid %pid%
)
goto:eof
:restart
call :stop
call :start
goto:eof
:status
for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
set pid=%%a
set image_name=%%b
)
if not defined pid (echo process %AppName% is dead ) else (
echo %image_name% is running
)
goto:eof
java 启动
由于 javaw 方式启动不会出现命令提示符黑窗口,并且通过 上面 vitality.bat 脚本内容启动的方式,需要手动选择序号来启动,这样就无法开机启动,并无法通过黑窗口看实时启动和运行日志。
因此下面提供一个简单的通过 java(而不是 javaw),启动的脚本(要关闭应用,直接关闭命令提示符黑窗口即可)。
start.bat
bash
@rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码
@echo off
title=Vitality-Service
@rem 延时启动。这里倒计时 10 秒开始启动应用
echo 启动倒计时:
timeout /T 10 /NOBREAK
rem jar平级目录
set AppName=vitality-admin.jar
rem JVM参数
set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
echo starting……
java %JVM_OPTS% -jar %AppName%
PAUSE
开机自启
将程序 vitality-admin.jar 和启动脚本 start.bat 放在同一目录,如:
bash
D:\work\vitality-admin.jar
D:\work\start.bat
创建 start.bat 的快捷方式,复制到 Windows 的启动目录下:
bash
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
# C:\ProgramData\Microsoft\Windows\「开始」菜单\程序\启动
# 比如:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\vitality_start.bat - 快捷方式
之后,只要重启操作系统,就可以自动打开命令提示符窗口,启动应用。
但这时候开机虽然启动了应用,但有一个命令提示符黑窗口出现在屏幕中央,我们希望开机启动的时候,自动最小化命令提示符黑窗口。这时候按照以下步骤设置:
- 右键单击【vitality_start.bat - 快捷方式】,选择【属性】
- 在【快捷方式】选项卡中,找到【运行方式】,默认值为【常规窗口】
- 这里修改为【最小化】,然后保存即可。
如果依赖其他服务比如 Redis,需要先启动 Redis 再启动 vitality-admin.jar 怎么办?
假如有如下启动脚本:
bash
D:\work\redis_start.bat
D:\work\vitality_start.bat
D:\work\start_all.bat
我们可以新增加一个 start_all.bat 脚本:
bash
@echo off
title=Start-All
@rem /min: 启动时以最小化窗口的方式。
echo Redis Starting.....
start /min redis_start.bat
@rem 延时启动。这里延时时 30 秒开始启动应用。>nul 意思是不显示过程。
@rem 符号【>nul】等同于【1>nul】,是屏蔽操作成功显示的信息,但是出错还是会显示
@rem 符号【2>nul】是屏蔽操作失败显示的信息,如果成功依旧显示。
timeout /T 30 /NOBREAK >nul
@rem 如果不加 >nul 的话,命令如下:
@rem 此时命令提示符窗口会显示:等待 n 秒,按 CTRL+C 退出......
@rem 其中 n 是倒计时的秒数,会一直减一动态变化。
@rem 如果不想显示倒计时这个过程,就加上 >nul
echo 启动倒计时:
timeout /T 30 /NOBREAK
echo Vitality Starting.....
start /min vitality_start.bat
关于 call 和 start 命令
call 和 start 命令都可以在一个 a.bat 中调用另一个 b.bat 脚本,但也有一些不同。
- call: 通过 call 命令,我们可以调用另一个 bat 文件,执行完会再返回到原本的 bat 文件中继续执行。
- start: 假如我们希望另外启动一个新的 cmd 窗口来运行 b.bat,可以通过 start 命令来实现