手机访问          
logo
将springboot的jar包注册成window服务
更新时间:2018-09-12 19:13:40    4274次阅读 评论 1

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"

操作了好多次,表示结果如一


然后这个方案就没有试验成功。。。


分享按钮 分类:java
  

create:2018-09-12    阅读量(4274) 评论(1 )
头像
楼主  零零一  2019-04-09 15:23  发表

第二种方面,后面操作了几遍,是可以成功的,之前操作不成功的原因是 CLASSPATH 变量值里边的 jar命名跟本地不匹配(路径错了),导致一直失败


返回顶部
登录评论
  ABOUT ME
头像
昵称零零一
博龄 { 58.3月 }
积分610
博主被推荐的文章
相关博文
推荐博文
    倒影
    触发事件方法
    疾病及编码介绍十六、先天性畸形、变形和染
    局部变量declare 与 case w
    推理术三——归纳推理术
    飞蚊症取穴
    RSA加密导致堆内存溢出
    SQL Server中@@ROWCOUN
    jconsole远程连接 jmx连接
    填充Excel模板的
标签云
反馈 联系©2015-2016 2016 ©zhoubo15.cn 粤ICP备15029033号-1