好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解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 文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<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的系统上启动失败。有错误不可怕,可怕的是不会找错误日志。

启动windows服务失败

服务启动成功后自动关闭,配置的日志文件也没有生成。尝试用cmd执行java -jar的命令,服务可以正常启动。但可具体是什么错误却不得而知。其实windows服务是有日志管理的。选择:控制面板---管理工具---事件查看器---window日志---应用程序---找出对应服务的日志。如下:

?

1

2

3

4

5

6

service cannot be started.

system测试数据ponentmodel.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文件。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

@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://HdhCmsTestcnblogs测试数据/itdragon/p/10513474.html

查看更多关于详解SpringBoot注册Windows服务和启动报错的原因的详细内容...

  阅读:25次