bat脚本启动Java服务
创始人
2024-04-10 16:16:37
0

bat脚本启动Java服务

    • 1.终端cmd窗口运行jar
    • 2. bat脚本启动jar包
    • 3.后台启动bat脚本
    • 4. 运行bat只启动一次jar服务及停止脚本
    • 5.注意事项
    • 6.所用资源

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.exe会在窗口中打印信息,而javaw.exe不会显示任何东西。

在这里插入图片描述

如果想指定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包的命令去查找进程(思路来源于:Java调用执行python脚本 )

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 offfor /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 %%Iif %%I GTR 1 (echo processid is: %%Iset pid=%%Igoto break)
):breakif 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 offfor /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: %%Iset pid=%%Igoto 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:breakpause

5.注意事项

  • bat语法中,不能想Java一样使用break来终止for循环,而是使用 goto的方式来跳出循环。
  • bat中 比较符号 表示如下:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
  • bat中定义变量set port=9001 等号两边不能有空格,否则是错误命令行。
  • 使用wmic命令获取的进程,要判断是否获取到进程id不能判断其是否为空字符,且判断获取的%%I是否大于1,中%%I不能加中括号,[%%I],否则被当成字符形式,一直满足判断条件。导致终止不了for循环

6.所用资源

脚本资源

相关内容

热门资讯

诉讼纠纷频发!中央商场子公司又... 继控股子公司新亚百货面临补缴税款及滞纳金7392万元后,百货零售巨头中央商场(600280.SH)另...
从明天起,楼市迎来两大利好政策... 作者:暴哥 来源:暴财经pro 同志们,2025年要过去了! 今年,各位在股市里应该收获不少,把过去...
国台办回应台湾网红“馆长”大陆... 12月31日,国台办举行例行新闻发布会,国台办发言人张晗就近期两岸热点问题回答记者提问。 有记者提问...
中钢天源:股东中钢热能院907... 雷达财经 文|冯秀语 编|李亦辉 12月30日,中钢天源(证券代码:002057)发布公告称,其控股...
宇树科技因侵权责任纠纷案件被起... 天眼查法律诉讼信息显示,近日,杭州宇树科技股份有限公司及邵某新增1条开庭公告,原告为孙某,涉及侵权责...
今日视点:“制度创新+科技突破... 2025年,A股市场交易活跃度持续提升。截至12月30日,全年累计成交金额达417.8万亿元,同比增...
专业文章丨第二顺位抵押权人实现... 【珠海律师、珠海法律咨询、珠海律师事务所、京师律所、京师珠海律所】 (本文转载自北京市京师郑州律师事...
企业就网络谣言报案并追究法律责... 2025-12-31 09:41:29 作者:狼叫兽 声明指出,目前相关网络平台已对上述不实信息进...
2026年1月份库伦旗党政领导... 为深入学习贯彻习近平总书记关于加强和改进人民信访工作的重要思想,坚持和发展新时代“枫桥经验”“浦江经...
商务部:各地可在消费品以旧换新... 商务部等7部门近日联合印发《关于提质增效实施2026年消费品以旧换新政策的通知》。商务部消费促进司负...