SpringBoot注册Windows服务和启动报错的原因

SpringBoot注册Windows服务和启动报错的原因

Windows系统启动Java程序会弹出黑窗口。黑窗口有几点不好。首先它不美观;其次容易误点导致程序关闭;但最让我匪夷所思的是:将鼠标光标选中黑窗口日志信息,程序竟然不会继续执行,日志也不会继续输出。从而导致页面一直处于请求状态。回车后程序才能正常执行。同时客户希望我们能部署在Windows系统上并且做到开机自动启动。针对以上需求将系统程序注册成Windows服务变得尤为重要。

针对于SpringBoot程序,目前主流的方法是采用winsw,简单方便。可是在开发过程中,针对不同的系统,启动服务可能会出现意想不到的结果。同样的配置方法,在win10可以成功注册并启动服务。而在windows server 2012 却启动失败。这里分享我的经验。

注册windows服务

制作流程

winsw是⼀款可以将可执⾏程序安装成Windows Service的开源⼩⼯具,官⽹地址, 下载地址
制作步骤:
第一步:将springboot项目打包成MyServer.jar

第二步:将下载的WinSW.NET2.exe 改名为MyServer.exe

第三步:将下载的sample-minimal.xml 改名为MyServer.xml

第四步:注册和启动服务

这里重点介绍 sample-minimal.xml 文件

<service>
 <!-- Windows 服务唯一标识ID-->
 <id>My Server</id>
 <!-- Windows 服务名称--> 
 <name>My Server</name> 
 <!-- Windows 服务描述--> 
 <description>This service is a service cratead from a minimal configuration</description> 
 <!-- 启动的可执行文件的路径,如果已经配置环境变量,则不必写全路径(则其实是一个坑) -->
 <executable>java</executable> 
 <arguments> -jar MyServer.jar --spring.datasource.url=jdbc:mysql://localhost:3306/database </arguments> 
 <!-- 日志路径,若目录不存在,则默认为配置文件所在的同一目录--> 
 <logpath>ServerPath\log\dashboard\</logpath> 
 <!-- 日志模式,默认为append追加模型,rotate为旋转模式-->
 <logmode>rotate</logmode> 
</service>

executable:启动可执行文件的全路径,如果配置环境变量,则可以简写,所有这里填写Java

arguments:命令执行的参数

logpath:配置日志路径

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

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

winsw常用命令

  • MyServer.exe install:安装服务
  • MyServer.exe uninstall:删除服务
  • MyServer.exe start:启动服务
  • MyServer.exe stop:停⽌服务
  • MyServer.exe restart:重启服务
  • MyServer.exe status:输出当前服务的状态

MyServer.exe 是WinSW.NET2.exe文件。在win10系统上一次成功,没有多余的烦恼。可生活哪有这么容易,在windows server 2012 r2的系统上启动失败。有错误不可怕,可怕的是不会找错误日志。

806956-20190312211859573-565590286.jpg

启动windows服务失败

服务启动成功后自动关闭,配置的日志文件也没有生成。尝试用cmd执行java -jar的命令,服务可以正常启动。但可具体是什么错误却不得而知。其实Windows服务是有日志管理的。选择:控制面板---管理工具---事件查看器---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改为了全路径。重新注册服务并启动,结果服务启动成功了。一肚子的火不知道往那撒。

为了避免这种事情再次发生,决定将executable的内容设置成Java的全路径,于是简单写了一个bat文件。

@echo off
# 获取java环境变量 
set JAVA_HOME=%JAVA_HOME%
echo %JAVA_HOME%
# 替换java路径
setlocal enabledelayedexpansion
set file=%cd%\MyServer.xml
set file_tmp=%cd%\MyServer_tmp.xml
set source=JAVAHOME
set replaced=%JAVA_HOME%\bin\java

for /f "delims=" %%i in (%file%) do (
    set str=%%i
        set "str=!str:%source%=%replaced%!"
        echo !str!>>%file_tmp%
)
move "%file_tmp%" "%file%"
# 注册并启动服务
MyServer.exe uninstall
MyServer.exe install
MyServer.exe start
EXIT 

转载于:https://www.cnblogs.com/itdragon/p/10513474.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Wins11终端中,可以使用多个命令来运行指定的工具或执行特定的操作。 一种常见的命令是`go tool`命令,用于运行指定的Go工具。使用`go tool`命令,可以运行`go help tool`命令来获取关于每个工具命令的更多信息。该命令还可以打印已知工具的列表。例如,要运行特定的Go工具,可以使用以下命令:`go tool command [args...]`。其中,`command`是要运行的工具命令的标识符,`args...`是工具命令的参数。请注意,使用`-n`标志可以打印将要执行的命令,但不实际执行它。 另一个常见的命令是`ping`命令,用于测试网络的连通性。在Wins11终端中,可以直接使用`ping`命令来ping指定的IP地址。然而,有时在Windows终端中使用`ping`命令可能会出现一些问题,具体情况可能因网络配置或其他因素而异。 除此之外,Wins11终端还提供了许多其他命令,可以用于执行各种操作。例如,可以使用`Net Continue`命令来继续挂起的网络服务,使用`Net File`命令来查看或关闭打开的文件,使用`Net Group`命令来管理用户组,使用`Net Help`命令来获取关于特定命令的帮助信息,等等。Wins11终端还提供了许多其他有用的命令,可以根据具体需求选择合适的命令来执行相应操作。 最后,如果你想对Go代码进行格式化,可以使用`gofmt`命令。在Wins11终端中,可以运行`go fmt`命令来对指定的包进行重新格式化。该命令将运行`gofmt -l -w`命令,并打印被修改的文件名。使用`-n`标志可以打印将要执行的命令,而`-x`标志可以打印命令的执行过程。 总结起来,Wins11终端提供了丰富的命令来运行工具、测试网络连通性、执行各种操作和格式化Go代码。具体使用哪个命令取决于你的需求和具体情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值