1、springboot里边自带集成运行容器(例如),如果为了打包生产部署然后将其运行容器去掉,表示比较部署流程不流畅;
这样子考虑使用其自带的运行容器,直接打成jar运行就行了
2、在网上查询相关的资料,如果要将jar包注册成window服务,现在大体上有两个方案
一个是使用springboot官方推荐的
https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#deployment-windows
另外一个使用Apache里边的一个插件procrun
http://commons.apache.org/proper/commons-daemon/procrun.html
第一方案:要从网上下载个winsw这个工具
官网 https://github.com/kohsuke/winsw
资源
http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/
然后将这个工具的 exe文件以及xml文件放到一个目录里边
比如demo目录
我们看看这个目录结构
demo/ ----/demo.exe ----/demo.xml ----/demo.jar
看到这个结构.exe文件必须和.xml的文件命名一直
另外exe和xml文件都是我们下周winsw里边的文件重新命名过来的
首先看下demo.xml文件的配置
<?xml version="1.0" encoding="UTF-8"?> <service> <id>demo</id> <name>demo</name> <description>你的应用描述</description> <env name="MYAPP_HOME" value="%BASE%"/> <executable>java</executable> <arguments>-Xmx256m -jar "%BASE%\demo.jar"</arguments> <logmode>rotate</logmode> </service>
相关参数说明如下
id:id是安装成windows服务后的服务名,id必须是唯一的。
name:name是服务的简写名字,name也必须是唯一的,这里我设为和id相同。
description:服务的文字说明。
executable:执行的命令,因为启动springboot应用的命令是
java -jar demo.jar
,所以这里写java,如果java没有安装到系统path里,则这里必须全路径。arguments:命令执行参数, 如果端口号要在这里设置,可以在后面添上:
--server.port=8080
然后注册服务
cmd 目录到demo目录下
然后执行 demo.exe install
正常的话服务启动不报错
然而,我执行这个命令的时候却是出现问题了
提示要求我必须装.net.framwork.v4.0...组件
然后从微软那边下了这个组件
然后安装,安装完后再次执行安装服务命令
demo.exe install
然后出现下面的异常
2018-09-12 16:32:31,480 DEBUG - Starting ServiceWrapper in the CLI mode 2018-09-12 16:32:33,757 INFO - Installing the service with id 'demo' 2018-09-12 16:32:33,817 FATAL - WMI Operation failure: AccessDenied WMI.WmiException: AccessDenied at WMI.WmiRoot.ClassHandler.Invoke(Object proxy, MethodInfo method, Object[] args) at WMI.Win32ServicesProxy.Create(String , String , String , ServiceType , ErrorControl , StartMode , Boolean , String , String , String[] ) at winsw.WrapperService.Run(String[] _args, ServiceDescriptor descriptor) at winsw.WrapperService.Main(String[] args)
这是为什么???
最后经排查发现是这个用户被拒绝执行安装服务命令
这时候就考虑使用管理员来运行cmd命令去操作
结果服务安装成功
第二种方案 使用procrun安装window服务
具体执行操作在这里 https://blog.csdn.net/chemphone/article/details/79130108
安装服务启动install.bat
设置为
@echo off rem 设置程序名称 set SERVICE_EN_NAME=schedule-tools set SERVICE_CH_NAME=schedule-tools rem 设置java路径 set JAVA_HOME=%JAVA_HOME% rem 设置程序依赖及程序入口类 cd.. set BASEDIR=%CD% set CLASSPATH=%BASEDIR%\at-deploy-jars\schedule-tools.jar set MAIN_CLASS=com.demo.EXE_GO rem 设置prunsrv路径 set SRV=%BASEDIR%\source\amd64\prunsrv.exe rem 设置日志路径及日志文件前缀 set LOGPATH=%BASEDIR%\schedule-tools\logs rem 输出信息 echo SERVICE_NAME: %SERVICE_EN_NAME% echo JAVA_HOME: %JAVA_HOME% echo MAIN_CLASS: %MAIN_CLASS% echo prunsrv path: %SRV% echo classpath %CLASSPATH% rem 设置jvm if "%JVM%" == "" goto findJvm if exist "%JVM%" goto foundJvm :findJvm set "JVM=%JAVA_HOME%\jre\bin\server\jvm.dll" if exist "%JVM%" goto foundJvm echo can not find jvm.dll automatically, echo please use COMMAND to localation it echo then install service goto end :foundJvm echo 正在安装服务... rem 安装 "%SRV%" //IS//%SERVICE_EN_NAME% --DisplayName="%SERVICE_CH_NAME%" "--Classpath=%CLASSPATH%" "--Install=%SRV%" "--JavaHome=%JAVA_HOME%" "--Jvm=%JVM%" --JvmMs=256 --JvmMx=1024 --Startup=auto --JvmOptions=-Djcifs.smb.client.dfs.disabled=false ++JvmOptions=-Djcifs.resolveOrder=DNS --StartMode=jvm --StartClass=%MAIN_CLASS% --StartMethod=start --StopMode=jvm --StopClass=%MAIN_CLASS% --StopMethod=stop --StopParams=stop --LogPath=%LOGPATH% --StdOutput=auto --StdError=auto echo 安装服务完成。 pause
MAIN_CLASS:com.demo.EXE_GO
试验这个方案执行服务启动的时候,发现经常报这个错误
java.lang.NoClassDefFoundError: com/demo/EXE_GO Caused by: java.lang.ClassNotFoundException: com.demo.EXE_GO at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) Exception in thread "main"
操作了好多次,表示结果如一
然后这个方案就没有试验成功。。。