使用Apache Commons Daemon將jar檔案部署為Windows服務(部分轉載)
首先,先說明我的目的。我為了將公司研究院開發的業務流程引擎元件(基於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就是使用它實現啟動及停止的。提供啟動、停止、解除安裝等操作)。詳細介紹可見
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="%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服務的全過程,公司自己的引擎程式碼就不提供了。
本人剛參加工作的小白一枚,請各路大神斧正!