您的位置:首页 > 运维架构 > Apache

使用Apache Commons Daemon将jar文件部署为Windows服务(部分转载)

2018-01-08 14:42 615 查看
首先,先说明我的目的。我为了将公司研究院开发的业务流程引擎组件(基于eBPM,负责执行遵循BPMN2.0规范的XML流程模板。同时提供与流程操作相关的各个接口。例如查询流程定义,发布流程,删除流程,创建流程实例,查询待办已办等)部署为Windows服务,使其能够像其他Windows服务一样开机自启。这样我们就可以把业务流程引擎组件作为服务安装到服务器上,随着服务器的启动而启动,无需在手动执行启动脚本。

参考出处:http://blog.csdn.net/masson32/article/details/51830656

目前我了解的将Java程序部署为Windows服务的方式有java service wrapper和Apache Commons Daemon两种。

1.概述

1.1  为什么使用Apache Commons Daemon

      java service wrapper使用简单,集成方法简单,不修改任何代码,一般情况下已满足需求。但是,java service wrapper只对java程序的开启及关闭进行操作,若需要对程序启动前及关闭前进行一些自定义的操作(如启动时初始化工作,关闭时释放某些资源或进行特殊操作),此时就可以使用apache commons daemon了。

1.2  Apache Commons Daemon介绍

      Apache common deamon是用来提供java服务的安装,实现将一个普通的 Java 应用变成系统的一个后台服务,在linux下部署为后台运行程序,在windows部署为windows服务(著名的tomcat就是使用它实现启动及停止的。提供启动、停止、卸载等操作)。详细介绍可见commons-daemon官网。相对java
service wrapper,commons daemon需要自己写少许代码,即按规定要求编写程序启动及关闭的入口类,仅此而已。

2.过程

下载commons-daemon主程序
commons-daemon-1.1.0-bin.zip
,解压出commons-daemon-1.1.0.jar

下载procrun,官网的procrun页面只对它的使用进行讲解,在哪里下载即没有提及,这里特别提醒一下,需要在这里下载procrun,下载
commons-daemon-1.1.0-bin-windows.zip
。解压出文件如下:






将你的Java程序打成jar包,commons-daemon-1.1.0.jar和prunsrv.exe,prunmgr.exe,install.bat,uninstall.bat放到同一个文件夹下(注意64位的机器要用amd64文件夹下的prunsrv.exe)

下面来写服务安装脚本  install.bat

@echo off

rem 设置程序名称
set SERVICE_EN_NAME=eBPM
set SERVICE_CH_NAME=业务工作流引擎

rem 设置java路径
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_131

rem 设置程序依赖及程序入口类
set BASEDIR=%CD%
set BPM_LIBS=%BASEDIR%\server\lib
set BPM_3RD_LIBS=%BASEDIR%\server\3rd_lib
set BPM_EXT_LIBS=%BASEDIR%\server\ext_lib
set BPM_LOG=%BASEDIR%\config\log
set CLASSPATH=%BPM_LIBS%\*;%BPM_3RD_LIBS%\*;%BPM_EXT_LIBS%\*;%BPM_LOG%;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%BPM_3RD_LIBS%\license-1.0.jar;

rem 设置prunsrv路径
set SRV=%BASEDIR%\prunsrv.exe

rem 设置日志路径及日志文件前缀
set LOGPATH=%BASEDIR%\server\work\logs

rem 输出信息
echo SERVICE_NAME: %SERVICE_EN_NAME%
echo JAVA_HOME: %JAVA_HOME%
echo MAIN_CLASS: %MAIN_CLASS%
echo prunsrv path: %SRV%

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 for example : set "JVM=C:\Program Files\Java\jdk1.8.0_25\jre\bin\server\jvm.dll"
echo then install service
goto end
:foundJvm

rem 安装
"%SRV%" //IS//"%SERVICE_EN_NAME%" --DisplayName="%SERVICE_CH_NAME%" --Classpath="%CLASSPATH%" --Install="%SRV%" --JavaHome="%JAVA_HOME%" --Jvm
87cb
="%JVM%" --JvmMs=256 --JvmMx=1024 --Startup=auto --JvmOptions=-Djcifs.smb.client.dfs.disabled=false ++JvmOptions=-DBPM_HOME=%BASEDIR% ++JvmOptions=-Djcifs.resolveOrder=DNS --StartPath="%BASEDIR%" --StartMode=jvm --StartClass=com.cnpc.richfit.bpm.bootstrap.BPMStarter --StartMethod=doStartStandalone --StopPath="%BASEDIR%" --StopMode=jvm --StopClass=com.cnpc.richfit.bpm.bootstrap.BPMStarter --StopMethod=doStop --LogPath="%LOGPATH%" --StdOutput=auto --StdError=auto

:end

要注意的是classpath中的路径应有你Java程序的所有依赖包以及你自己打包程序的那个jar包,上述解压出的commons-daemon-1.1.0.jar也应该在这个路径中。

%SRV%  为prunsrv.exe所在路径

%LOGPATH%  为日志路径,在服务部署号及启动时会出现如下日志:



commons-daemon,ebpm-stderr,ebpm-stdout为服务安装时产生的日志,trace为启动和停止服务时产生的日志。

--StartMethod   为程序入口开始方法(对应部署服务之后的启动)   必须要在自己打包的Java程序中写这个方法,根据自己的业务逻辑编写即可。(在某些博客中看到这个方法必须命名为start,实践证明并不需要,但你一定要有这个开始方法)。

--StopMethod   为程序入口结束方法(对应部署服务后的停止)   必须要在自己打包的Java程序中写这个方法,根据自己的业务逻辑编写即可。(在某些博客中看到这个方法必须命名为start,实践证明并不需要,但你一定要有这个结束方法)。

要格外注意的是以上两个方法一定要声明为public static void,并且一定要带参数(如string[] args),不然Apache Commons Daemon会报错,详情请见Apache Commons Daemon的官方说明文档。建议你所打包的Java入口程序中不写main方法,只写开始和结束方法。

再来写服务卸载脚本  uninstall.bat

@echo off
set BASEDIR=%CD%
set SERVICE_NAME=eBPM
set "SRV=%BASEDIR%\prunsrv.exe"

%SRV% //DS//%SERVICE_NAME%

:end


简言之,到这一步为止,你的目录结构下应该有你自己打的jar包,commons-daemon-1.1.0.jar,prunsrv.exe,prunmgr.exe,install.bat,uninstall.bat

此时运行install.bat脚本即可,运行之后会发现服务中多了一个eBPM服务,可以正常的启动和停止。

服务安装成功后将prunmgr.exe重命名为eBPM.exe即为你的服务名即可显式的进行各种参数的配置,如下图



打出如下日志即为成功





以上就是我将公司开发的业务工作流引擎部署为Windows服务的全过程,公司自己的引擎代码就不提供了。

本人刚参加工作的小白一枚,请各路大神斧正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: