在windows环境下使用winsw将jar包注册为服务(实现开机自启和配置日志输出模式)

前言

Windows系统使用java -jar m命令行运行Java项目会弹出黑窗。首先容易误点导致程序关闭,其次我们希望能在Windows系统做到开机自动启动。因此对于SpringBoot程序,目前主流的方法是采用winsw,简单容易配置

1.下载winsw工具

https://github.com/winsw/winsw/releases

在这里插入图片描述

2.文件配置

修改WinSW和sample-minimal.xml名称

将下载的文件与jar文件放置在一起,两个文件名修改为服务名(服务名自定义)
在这里插入图片描述

编辑xml文件

注意不要出现中文, arguments和logpath标签内的jar文件地址要改为自己的目录

<service>
  <!-- ID of the service. It should be unique across the Windows system-->
  <id>testapp</id>
  <!-- Display name of the service -->
  <name>test service</name>
  <!-- Service description -->
  <description>This service is a service created from a minimal configuration</description>
   
  <env name="JAVA_HOME" value="%JAVA_HOME%"/>
     
  <executable>java</executable>
 
  <arguments>-jar "H:\testautostart\cxstar-api-rest-1.0.0.jar"</arguments>
 
  <startmode>Automatic</startmode>

  <logpath>H:\testautostart\logs</logpath>
 
  <logmode>rotate</logmode>
	
</service>

logmode:日志输出模式,默认为append,官方文档

参数解析

标签名 作用
id 服务ID,在windows系统中必须唯一的系统标识
name 服务显示名称,不能使用中文,仅限英文、数字、横线等
description 服务描述,描述服务的作用
env 设置环境变量
executable 启动可执行文件的路径,如果配置了Java环境变量,可以直接使用java替代。否则使用全路径(这里容易坑)
arguments 传递给可执行文件的参数
startmode 指定Windows服务的启动模式,它可以是下列值之一:开机、系统、自动或手动, 默认值是“Automatic”
logpath 配置日志路径
logmode 日志输出模式,默认为append

logmode:

  1. append (追加模式)其特点是将日志文件全部输出在一个文件中,这个文件可能会越来越大
  2. rotate(旋转模式,推荐)当日志文件大小达到10兆(默认值),winsw会将日志重新输出到另外一份日志文件,默认最多保留8个
  3. reset(重置模式)每次重启服务都会重置日志文件
  4. none(忽略模式)几乎不会生成日志文件

3.注册服务

当前目录输入cmd,进入命令行模式,执行服务注册命令

testapp.exe install

在这里插入图片描述
服务中已经存在该服务
在这里插入图片描述
双击设置为自动即可
在这里插入图片描述

卸载服务:

testapp.exe uninstall

在这里插入图片描述
其他服务命令:

testapp.exe start:启动服务
testapp.exe stop:停⽌服务
testapp.exe restart:重启服务
testapp.exe status:输出当前服务的状态

关于在windows server 2008启动失败的问题

服务启动成功后自动关闭,日志文件也没有生成。执行java -jar的命令,服务可以正常启动。在控制面板—管理工具—事件查看器—window日志—应用程序—找出对应服务的日志。如下:

Service cannot be started. 
System.ComponentModel.Win32Exception: The system cannot find the file specified 
at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) 
at winsw.WrapperService.StartProcess(Process processToStart, String arguments, String executable) 
at winsw.WrapperService.OnStart(String[] _) 
at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

提示很清楚,系统没有找到指定文件,而在winsw的xml文件中就已经配置了executable,而且环境变量配置正确。那为什么还提示文件没有找到?于是将java改为了全路径,重新注册服务并成功启动服务

猜你喜欢

转载自blog.csdn.net/qq_29864051/article/details/130937886