• bat脚本启动Java服务


    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不会显示任何东西。
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    如果想指定jar包启动时用的配置文件,可用-Dspring.config.location指定配置文件路径,这样即可达到配置文件参数可修改的目的:

    java -jar myzhxy-1.0.0.jar -Dspring.config.location=D:\config\application.properties
    
    • 1

    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
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4. 运行bat只启动一次jar服务及停止脚本

    通过bat脚本后台启动jar服务后,可能会出现在启动之前,该服务要使用的端口已经被占用,或者说该服务已经被启动,则需要将被占用的端口释放掉,且事先需要判断该jar服务是否被启动,如果已经在启动状态,则不需要重新启动。

    查找端口是否被占用,如果端口被占用则将该端口的进程杀掉:

    netstat -ano |findstr 9001 // 根据端口号查进程
    taskkill /f /pid 8224  // 根据进程id杀进程
    
    • 1
    • 2

    在这里插入图片描述

    由于端口有可能是被其他服务占用,所以要判断该jar服务是否被启动就不能再通过端口是否被占用来判断了。这时可以用wmic通过执行jar包的命令去查找进程(思路来源于:Java调用执行python脚本

    wmic process where 'commandline like "%myzhxy-1.0.0.jar%"' get processid
    
    • 1

    在这里插入图片描述
    但是,发现通过该命令查找的进程有两个,且将第一个杀掉之后,再次执行该命令查找进程还是能查到。
    再次运行该bat,查找命令,同时将name查找出来,会发现,查出来两个进程id是因为wmic本身也算启了一个进程。即可通过执行器的name和执行命令一起查询进程id,杀掉之后再次查询出现没有可以实例即表明该服务已经被停止了:

    wmic process where 'name = "java.exe" and commandline like "%myzhxy-1.0.0.jar%"' get processid,name
    
    • 1

    在这里插入图片描述
    即,同理,停止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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述
    则,只启动一次的,若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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    5.注意事项

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

    6.所用资源

    脚本资源

  • 相关阅读:
    protobuf 反射使用总结
    最新版校园招聘进大厂系列----------(3)字节篇 -----未完待续
    LS-dnay 压力显示异常
    QT 点击窗口外区域 当前窗口自动关闭
    小程序源码:最新掌上题库微信小程序源码下载,修复登录接口,支持在线考试,自定义导入考题
    【10】leetcode note
    ChatGPT专业术语及有效使用方法概述
    Session
    【SpringBoot】SpringBoot整合MyBatis-Plus
    【C++】基础容器(学习笔记)
  • 原文地址:https://blog.csdn.net/weixin_43763430/article/details/127946943