参考:
https://www.jianshu.com/p/fc9e4ea61e13
https://blog.csdn.net/qq_28566071/article/details/80882503
spring官方推荐使用winsw来将springboot项目作为服务运行,参考https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#deployment-windows
1.把java程序打包为jar包
2.下载winsw
winsw是一款可将可执行程序安装成Windows Service的开源工具,github:https://github.com/kohsuke/winsw/releases
前言
由于我们公司java应用是部署在windows服务器上的,jenkins在部署spring boot时会一直等待直到超时才结束,这个主要原因是因为spring boot 启动一直是在前台运行(控制台一直在打印),所以jenkins会认为这个任务没有执行完成,就会一直在执行。如果是linux系统可以使用nohup命令,但windows就不行,没这个命令,所以我把java 应用做成windows服务,每次部署成功只要重启服务即可。
winsw制作windows服务器
winsw(github地址源码地址,exe下载地址,官方英文安装文档)是一个开源的专门用于制作windows服务的小工具,我们可以利用它来讲java程序做成windows服务。
在下载地址里下载最新版winsw。
准备三样东西
xxx.jar
xx.xml
xxx.exe
以MyApp.jar为例,注意xml和exe名字要保持一致。新建一个project文件夹
创建MyApp.xml文件
<service>
<id>MyApp</id>
<name>MyApp</name>
<description>This runs Spring Boot as a Service.</description>
<env name="MYAPP_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xmx256m -jar "%BASE%\MyApp.jar"</arguments>
<logmode>rotate</logmode>
</service>
上面的MYAPP_HOME是系统环境变量,我们需要像设置JAVA-HOME一样设置。地址指向jar文件地址,当然如果我们不使用环境变量的方式,那就直接在xml里指定jar的目录地址。我就是这样的方式。所以我的MyApp.xml文件为
<configuration>
<!-- ID of the service. It should be unique accross the Windows system-->
<id>OSCAR</id>
<!-- Display name of the service -->
<name>OSCAR(powered by WinSW)</name>
<!-- Service description -->
<description>这是winsw生成的服务</description>
<!-- Path to the executable, which should be started -->
<executable>java</executable>
<arguments>-jar mingpeng-0.0.1-SNAPSHOT.jar</arguments>
<!-- 开机启动 -->
<startmode>Automatic</startmode>
<!-- 日志配置 -->
<logpath>logs/service</logpath>
<logmode>rotate</logmode>
</configuration>
arguments是java命令后的一些参数,是自定义的。
id和name就是注册到windows服务的名字,建议和文件名保持一致,这里就是MyApp
创建MyApp.exe
其实不是重新创建而是重命名,将下载的winsw.exe重命名为MyApp.exe。注意名字要和MyApp.xml保持一致
官方这么说的:you have to rename the winsw.exe to MyApp.exe so that its name matches with the MyApp.xml,注意是必需
创建MyApp.jar
将准备好的jar重命名为MyApp.jar,当然,这个可以不是MyApp,也可以是其它的。比如MyApp.xml里的配置是这样的
<arguments>-Xmx256m -jar "myApp.jar" --spring.profiles.active=stage --spring.datasource.dbname=donglitestdb --server.port=9982</arguments>
1
是小写。
安装服务
至些就制作完成,就可以使用install/uninstall命令了
安装服务:MyApp.exe install
卸载服务:MyApp.exe uninstall
检查状态:MyApp.exe status
启动服务:MyApp.exe start或net start MyApp
停止服务:MyApp.exe stop或net stop MyApp
重启服务:MyApp.exe restart或
windows下没有重启服务,我们可以先stop服务再start服务。批处理如下
restart.bat
net stop %1
net start %1
1
2
重启服务:restart 服务名
问题
如果报“WMI Operation failure: AccessDenied”那就创建一个批处理文件,然后以管理员权限运行,
比如如下installDongLi.bat:
D:\tmp\dongliService\DongLi.exe install
pause
1
2
测试
按如下方式测试结果如下
终于成功了
winsw做包装其它程序
winsw也可以包装其它exe文件,或可启动文件。做成windows服务。以nginx为例
将winsw.exe改名为NginxService.exe
创建NginxService.xml如下
<service>
<id>NginxService</id>
<name>NginxService</name>
<description>This runs Spring Boot as a Service.</description>
<executable>D:\soft\nginx\nginx-1.15.2\nginx.exe</executable>
</service>
将上面文件放到nginx安装文件包下
创建installService.bat批处理文件
D:\soft\nginx\nginx-1.15.2\NginxService.exe install
配置完成后,命令行进入winsw所在的文件夹,执行“spider-1.0.exe install”,就注册服务了。
如果不再需要这个服务,使用spider-1.0.exe uninstall即可卸载服务。start启动和stop关闭服务