前言
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:
- append (追加模式)其特点是将日志文件全部输出在一个文件中,这个文件可能会越来越大
- rotate(旋转模式,推荐)当日志文件大小达到10兆(默认值),winsw会将日志重新输出到另外一份日志文件,默认最多保留8个
- reset(重置模式)每次重启服务都会重置日志文件
- 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改为了全路径,重新注册服务并成功启动服务