將Java jar文件部署為Windows后台服務有多種方法:Service Installer、Java service Wrapper、JavaService.exe等等。這里介紹下使用JavaService.exe來部署windows后台服務的方法。
1. 下載JavaService.exe, 最新的是2.0.10版本,請下載其zip包版本的即可
forge.ow2.org/projects/javaservice/
2. 安裝JavaService.exe
將下載的zip包解壓縮到任意目錄即可
3. 編譯一個測試jar(請從附件中下載): 每天11:00:00向time.log文件中寫入當前時間
- public static void main(String[] args) {
- // schedule task執?
- scheduler.schedule(new SchedulerTask() {
- public void run() {
- // TODO
- FileOutputStream writerStream = null;
- OutputStreamWriter outSW = null;
- try {
- writerStream = new FileOutputStream("F:/TestTimer/time.log");
- outSW = new OutputStreamWriter(writerStream, "UTF-8");
- //將緩沖對文件的?出
- final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
- outSW.write(sdf.format(new Date()));
- } catch (final IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 向緩沖區寫成功后?執?緩沖區刷新?使文件內容生效
- if (outSW != null) {
- outSW.close();
- }
- //關?文件流
- if (writerStream != null) {
- writerStream.close();
- }
- } catch (final IOException e) {
- e.printStackTrace();
- }
- }
- }
- }, new DailyIterator(11, 0, 0));
- }
4. 在jar文件所在的目錄下,建立如下批處理文件,執行后即可完成服務的注冊和auto start
- @echo off
- rem 修改控制台顏色
- color 1d
- rem * 使用JavaService將TestTimer安裝為Windows服務的腳本
- rem *
- rem * JavaService - Windows NT Service Daemon for Java applications
- rem * Copyright (C) 2006 Multiplan Consultants Ltd. LGPL Licensing applies
- rem * Information about the JavaService software is available at the ObjectWeb
- rem * web site. Refer to http://javaservice.objectweb.org for more details.
- rem 開始批處理文件中環境改動的本地化操作,在使用endlocal后環境將恢復到原先的內容
- SETLOCAL
- rem 設置環境變量,指向當前路徑
- SET BASE_PATH=%CD%
- rem 設置Java path: jre_home
- SET JRE_HOME=D:\Program Files\Java\jre1.5.0_11
- rem 判斷JRE_HOME是否正確
- if "%JRE_HOME%" == "" goto no_java
- if not exist "%JRE_HOME%\bin\java.exe" goto no_java
- rem 設置jvm內存分配情況
- set JVM_MEMORY=-Xms128m -Xmx256m
- rem 設置jvmdll使用哪一種模式
- SET jvmdll=%JRE_HOME%\bin\client\jvm.dll
- if not exist "%jvmdll%" SET jvmdll=%JRE_HOME%\bin\hotspot\jvm.dll
- if not exist "%jvmdll%" goto no_java
- rem 設置JavaService路徑
- set JSBINDIR=E:\AccountingTool\javaservice\JavaService-2.0.10
- set JSEXE=%JSBINDIR%\JavaServiceDebug.exe
- rem 判斷jar是否正確
- SET acctjar=%BASE_PATH%\TestTimer.jar
- if not exist "%acctjar%" goto no_peer
- @echo . Using following version of JavaService executable:
- @echo .
- "%JSEXE%" -version
- @echo .
- rem parameters and files seem ok, go ahead with the service installation
- @echo .
- rem 處理該批處理的輸入參數,后台服務啟動模式:自動
- SET svcmode=
- if "%1" == "-manual" SET svcmode=-manual
- if "%1" == "-auto" SET svcmode=-auto
- rem 設置JAVA_OPTS
- set JAVA_OPTS=%JAVA_OPTS% -Djava.class.path="%BASE_PATH%\TestTimer.jar"
- set JAVA_OPTS=%JAVA_OPTS% %JVM_MEMORY%
- rem 設置startstop
- SET START_STOP=-start cn.test.timer.TestTimer
- rem 設置Log文件路徑
- set OUT_ERR=-out "%BASE_PATH%\service_out.log" -err "%BASE_PATH%\service_err.log"
- rem 設置desp
- set DESP=-description "TestTimer Service"
- rem 設置執行命令行
- set runcmd="%JSEXE%" -install TestTimerService
- set runcmd=%runcmd% "%jvmdll%"
- set runcmd=%runcmd% %JAVA_OPTS%
- set runcmd=%runcmd% %START_STOP%
- set runcmd=%runcmd% %OUT_ERR%
- set runcmd=%runcmd% -current
- set runcmd=%runcmd% "%BASE_PATH%"
- set runcmd=%runcmd% %svcmode%
- set runcmd=%runcmd% -overwrite
- set runcmd=%runcmd% -startup 6
- set runcmd=%runcmd% %DESP%
- echo %runcmd%
- rem 執行安裝命令
- %runcmd%
- rem 啟動服務
- net start TestTimerService
- if ERRORLEVEL 1 goto js_error
- goto end
- :no_java
- @echo . 沒有Java運行環境,安裝腳本不能運行
- goto error_exit
- :no_peer
- @echo . 啟動文件TestTimer.jar不存在,安裝腳本不能運行
- goto error_exit
- :no_jsexe
- @echo . 可執行文件JavaService.exe 不存在,安裝腳本不能運行
- goto error_exit
- :js_error
- @echo . TestTimerService在安裝為服務的過程中發生了錯誤,請檢查相關日志文件
- goto error_exit
- :error_exit
- @echo .
- @echo . 安裝失敗,不能將 TestTimer安裝為Windows服務
- @echo .
- @echo . 命令格式:
- @echo .
- @echo . %~n0 [-auto / -manual] [-np]
- @echo .
- @echo . 其中:
- @echo . -auto (默認) or -manual 參數說明了服務的啟動模式:自動或者手動
- @echo . -np 批處理命令執行完畢后不暫停
- @echo .
- @echo . 比如:
- @echo . %~n0 -auto -np
- :end
- ENDLOCAL
- @echo .
- if "%2" NEQ "-np" @pause
注意: 其中JRE_HOME 和 JSBINDIR(javaservice路徑) 視安裝路徑而異。
5. 停止並卸載服務的批處理文件,其中service 名稱必須與上面注冊的service名稱一致
- @echo off
- rem 修改控制台顏色
- color 1d
- rem * 使用JavaService卸載TestTimerService服務的腳本
- rem *
- rem * JavaService - Windows NT Service Daemon for Java applications
- rem * Copyright (C) 2006 Multiplan Consultants Ltd. LGPL Licensing applies
- rem * Information about the JavaService software is available at the ObjectWeb
- rem * web site. Refer to http://javaservice.objectweb.org for more details.
- rem 開始批處理文件中環境改動的本地化操作,在使用endlocal后環境將恢復到原先的內容
- SETLOCAL
- rem 設置環境變量
- SET BASE_PATH=E:\AccountingTool\Release\AccountingTool\
- rem 設置JavaService的路徑
- set JSBINDIR=%BASE_PATH%\JavaService-2.0.10
- set JSEXE=%JSBINDIR%\JavaService.exe
- rem 卸載服務前先停止服務
- net stop TestTimerService
- rem 設置執行命令行
- set runcmd="%JSEXE%" -uninstall TestTimerService
- %runcmd%
- @echo .
- ENDLOCAL
- @echo .
- if "%2" NEQ "-np" @pause

