使用场景:

将jar程序设置为开机启动(注:windows上)

方法一:vbs文件方式

原理将文件放入windows启动文件夹,开机启动时会执行vbs文件

创建bat文件

将 java -jar xxxx.jar 执行命令放入bat文件中

1
2
3
@echo off
start java -jar xxxx.jar
pause
创建vbs文件
1
2
set ws=WScript.CreateObject("WScript.Shell") 
ws.Run "C:\xxxx.bat /start",0
创建vbs快捷方式

创建该vbs文件的快捷方式放入windows的启动文件夹内,不同系统文件夹路径不同

如:win10专业版 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

若找不到则直接资源管理器打开该地址 或者 必找到位置方式 win+R 键入 shell:startup回车

缺点:若给直接使用的人使用,不便于部署

方法二:windows服务方式

失败案例 sc

通过windows自带的sc.exe工具创建windows服务

  • 创建
1
sc.exe create XXXXname binpath= C:\XXXX.bat  start= auto

格式为 sc.exe create 服务名 binpath= 需要自启的bat路径 start= auto(服务启动方式)

  • 删除
1
sc.exe delete XXXXname

格式为 sc.exe delete 服务名

结果:可创建服务,但启动服务超时(windows 1053),网上找了很多解决方式如修改执行权限等无一解决,目前猜想,windows服务只能启动.exe文件,无法执行.bat文件

成功案例一 winsw

使用第三方winsw程序,原理为注册window服务启动winsw.exe,再由winsw.exe启动java程序

  • 环境需要JDK,所以jdk安装必不可少

  • 下载winsw程序,由于3版本没有2版本的简洁,使用的2版本的 下载地址

  • 为了区分启动的程序,需对winsw.exe改名为自定义的名字,如print.exe

  • 创建.xml配置文件(注:需与上面修改的名字相同 如print.xml)

    内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <configuration>
    <!-- service服务的id -->
    <id>print</id>
    <!-- service服务名 -->
    <name>print-service</name>
    <!-- service服务描述 -->
    <description>websocket 打印服务</description>
    <!-- 配置jar执行方式(下面的配置表示 使用JAVA_HOME目录下的java.exe去启动jar,即java -jar print.jar) -->
    <!-- 此处也可配置其它执行命令,不一定是 java -jar -->
    <env name="JAVA_HOME" value="%JAVA_HOME%"/>
    <executable>java</executable>
    <arguments>-jar "print.jar"</arguments>
    <startmode>Automatic</startmode>
    <!-- 服务启动的日志目录 -->
    <logpath>%BASE%\log</logpath>
    <logmode>rotate</logmode>
    </configuration>
  • 创建服务

    cmd管理员到当前目录下

    • 新增windows服务
    1
    print.exe install
    • 删除windows服务
    1
    print.exe uninstall
  • 启动服务

    windows运行 services.msc,找到新增的服务启动

  • 原理分析与解释

    启动服务成功后查看运行程序的详情,出现两个程序

    一个是windows服务程序(依托于java环境启动的,作用是使程序开机自启)

    一个是启动的jar程序,该程序由winsw.exe 执行 java -jar xxxx.jar命令启动的

    启动程序不会影响 运行jar包程序

缺点:启动程序需要JDK配置环境

本质:就是创建一个执行一条命令的windows服务


由于工作中用到的是单项目,则为了方便,写了其它bat来方便注册启动与卸载

  • xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<!-- service服务的id -->
<id>print</id>
<!-- service服务名 -->
<name>print-service</name>
<!-- service服务描述 -->
<description>websocket 打印服务</description>
<!-- 配置jar执行方式-->
<env name="JAVA_HOME" value="%JAVA_HOME%"/>
<executable>printService</executable>
<arguments>-jar "print.jar"</arguments>
<startmode>Automatic</startmode>
<!-- 服务启动的日志目录 -->
<logpath>%BASE%\log</logpath>
<logmode>rotate</logmode>
</configuration>
  • 注册
1
2
3
4
5
6
7
8
9
10
11
@echo
::获取管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo off
::到当前bat执行目录,必须加/d,否则除c盘外无法切换目录
cd /d %~dp0
::注册服务
print.exe install
::由于工作中为了区分启动的服务,便于控制,故复制一个java.exe程序并改名
copy %JAVA_HOME%\bin\java.exe %JAVA_HOME%\bin\printService.exe
pause
  • 卸载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo
::获取管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo off
::到当前bat执行目录,必须加/d,否则除c盘外无法切换目录
cd /d %~dp0
::杀掉两个进程
taskkill /f /im print.exe
taskkill /f /im printService.exe
::卸载服务
print.exe uninstall
::删除复制的java.exe
del %JAVA_HOME%\bin\printService.exe
pause
  • 开启服务
1
2
3
4
5
6
7
8
9
@echo
::获取管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo off
::停止服务
@net stop print-service
::启动服务
@net start print-service
pause
  • 关闭服务
1
2
3
4
5
6
7
8
@echo
::获取管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo off
::工作需要就直接杀进程
taskkill /f /im print.exe
taskkill /f /im printService.exe
pause
成功案例二 nssm

使用第三方nssm程序,原理为注册window服务启动nssm.exe,再由nssm.exe启动java程序

  • 下载nssm程序软件 下载地址

  • 官方常用命令 地址

  • 创建服务

    • 新增windows服务
    1
    2
    #nssm install 服务名 执行文件路径   若文件需要其它程序执行如jar,可以创建bat文件,将此处的bat作为执行文件
    nssm install printService %cd%\print.bat
    • 卸载window服务
    1
    2
    #nssm remove 服务名
    nssm remove printService
  • 启动服务

    • 启动服务
    1
    nssm start printService
    • 关闭服务
    1
    nssm stop printService

原理分析:与上面winsw原理一致


由于工作中用到的是单项目,则为了方便,写了其它bat来方便注册启动与卸载,与上面winsw一样

  • 实际执行bat
1
2
3
4
@echo
cd /d %~dp0
printService.exe -jar print.jar
pause
  • 注册
1
2
3
4
5
6
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo
cd /d %~dp0
copy "%JAVA_HOME%\bin\java.exe" "%JAVA_HOME%\bin\printService.exe"
nssm install printService %cd%\print.bat
pause
  • 卸载
1
2
3
4
5
6
7
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo
cd /d %~dp0
nssm stop printService
del "%JAVA_HOME%\bin\printService.exe"
nssm remove printService confirm
pause
  • 启动
1
2
3
4
5
6
7
8
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo
cd /d %~dp0
taskkill /f /im print.exe
taskkill /f /im printService.exe
nssm stop printService
nssm start printService
pause
  • 关闭
1
2
3
4
5
6
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo
nssm stop printService
taskkill /f /im print.exe
taskkill /f /im printService.exe
pause