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,官方文档
winsw常用命令
MyServer.exe 是WinSW.NET2.exe文件。在win10系统上一次成功,没有多余的烦恼。可生活哪有这么容易,在windows server 2012 r2的系统上启动失败。有错误不可怕,可怕的是不会找错误日志。
启动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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。