1.终端cmd窗口运行jar
Java项目一般会被打包成jar后启动,在windows系统中可以通过终端窗口cmd启动jar包,即在jar包所在的目录中打开cmd,或在cmd中进入到jar包目录,执行如下命令:
java -jar myzhxy-1.0.0.jar
或
javaw -jar myzhxy-1.0.0.jar
// java会在窗口中打印信息,而javaw不会显示任何东西。
如果想指定jar包启动时用的配置文件,可用-Dspring.config.location指定配置文件路径,这样即可达到配置文件参数可修改的目的:
java -jar myzhxy-1.0.0.jar -Dspring.config.location=D:\config\application.properties
2. bat脚本启动jar包
创建一个bat文件,将上面的命令放入bat文件即可,之后只需要将bat和jar包放在同一个目录下,双击bat脚本即可启动jar包服务。
3.后台启动bat脚本
以上的bat脚本双击运行后会出现黑色cmd的终端窗口,若不想出现该窗口,可让其后台启动运行,这样就可以避免不小心关闭了创建运行,即可在脚本开头加入以下代码:
if "%1"=="h" goto begin
start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
4. 运行bat只启动一次jar服务及停止脚本
通过bat脚本后台启动jar服务后,可能会出现在启动之前,该服务要使用的端口已经被占用,或者说该服务已经被启动,则需要将被占用的端口释放掉,且事先需要判断该jar服务是否被启动,如果已经在启动状态,则不需要重新启动。
查找端口是否被占用,如果端口被占用则将该端口的进程杀掉:
netstat -ano |findstr 9001 // 根据端口号查进程
taskkill /f /pid 8224 // 根据进程id杀进程
由于端口有可能是被其他服务占用,所以要判断该jar服务是否被启动就不能再通过端口是否被占用来判断了。这时可以用wmic通过执行jar包的命令去查找进程
wmic process where 'commandline like "%myzhxy-1.0.0.jar%"' get processid
但是,发现通过该命令查找的进程有两个,且将第一个杀掉之后,再次执行该命令查找进程还是能查到。
再次运行该bat,查找命令,同时将name查找出来,会发现,查出来两个进程id是因为wmic本身也算启了一个进程。即可通过执行器的name和执行命令一起查询进程id,杀掉之后再次查询出现没有可以实例即表明该服务已经被停止了:
wmic process where 'name = "java.exe" and commandline like "%myzhxy-1.0.0.jar%"' get processid,name
即,同理,停止jar服务的bat脚本也只能停止指定jar的服务,通过端口停止进程也有可能停止的是其他的服务。停止jar服务的bat脚本代码如下
@echo off
for /f "usebackq skip=1 tokens=*" %%I in (`wmic process where "name = 'java.exe' and commandline like '%%myzhxy-1.0.0.jar%%'" get processid 2^>null`) do (
echo %%I
if %%I GTR 1 (
echo processid is: %%I
set pid=%%I
goto break
)
)
:break
if defined pid (
echo pid = %pid%
echo taskkill /f /pid %pid%
taskkill /f /pid %pid%
echo Succeeded in killing the process.
) else echo The process does not exit.
pause
则,只启动一次的,若jar服务已启动则不启动,没有启动则先查看端口是否被其他进程占用,占用则释放端口后再启动的bat脚本代码如下:
@echo off
for /f "usebackq skip=1 tokens=*" %%I in (`wmic process where "name = 'java.exe' and commandline like '%%myzhxy-1.0.0.jar%%'" get processid 2^>null`) do (
if %%I GTR 1 (
echo processid is: %%I
set pid=%%I
goto break
)
)
set port=9001
echo port=%port%
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^|findstr %port%`) do (
if [%%d] EQU [LISTENING] (
set pid=%%e
)
)
if defined pid (
echo pid = %pid%
echo taskkill /f /pid %pid%
taskkill /f /pid %pid%
echo Succeeded in killing the process.
) else echo The process does not exit.
echo java -jar myzhxy-1.0.0.jar
java -jar myzhxy-1.0.0.jar
:break
pause
5.注意事项
bat语法中,不能想Java一样使用break来终止for循环,而是使用 goto的方式来跳出循环。
bat中 比较符号 表示如下:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
用txt新建一个后缀为bat文件
1.启动jar脚本
@echo off
START "app" javaw -jar app-0.0.1-SNAPSHOT.jar
2.停止jar脚本(如:jar包端口9090)
@echo off
set port=9090
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo kill the process %%m who use the port
taskkill /pid %%m -t -f
goto q
)
:q
3.重启jar脚本(就是上面两个合起来)
@echo off
set port=9090
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo kill the process %%m who use the port
taskkill /pid %%m -t -f
goto start
)
:start
START "app" javaw -jar app-0.0.1-SNAPSHOT.jar
win+r gpedit.msc打开策略制,然后添加
:: 启动其它程序
start xxx.exe
:: 启动vm虚拟机
chcp 65001
"C:\Program Files (x86)\VMware\VMware Workstation\vmrun" start "C:\Users\xxx\Documents\Virtual Machines\CentOS7\CentOS7.vmx" nogui
那把bat文件添加到策略组就行了,开机登录后会自动运行,没有弹窗。
但如果你的bat脚本内容是一些必须弹窗运行的命令,如下(弹窗)
@echo off
java p.hello
那么你必须额外制作.vbs文件,用vbs启动bat,将vbs添加到策略组。这样开机时才能弹出命令行窗口运行bat。
vbs文件内容为
createobject("wscript.shell").run "[YourBatFile].bat"