JavaプログラムをWindowsサービスとして起動

JavaプログラムをWindowsサービスとして起動


commons-daemonを使うのがいいらしい。Tomcat5.0以降にも採用されている。
procrunというのがWindows用のもので、prunsrv.exeというEXEで
サービスのインストールも実行もやる。


■commons-daemon.jar のダウンロード
http://commons.apache.org/daemon/download_daemon.cgi


なお、Tomcatには「tomcat6.exe」と「tomcat6w.exe」なんかが入っているが、
あれもprunsrv.exeと同じ。

メインクラス

サービス開始時にprocrunから呼ばれるクラスにはmainメソッドを実装し、
起動引数の第一引数が「start」の場合は開始処理(startメソッド)、
「stop」の場合は終了処理(stopメソッド)を呼び出すようにしておく。

停止フラグとなるbooleanのフィールド(isStopped)を1つ持たせ、
startメソッドはこれがfalseである間無限ループする。
(もちろんループごとに休む処理─sleep も適宜入れる。)
※startメソッドは、stopメソッドが呼ばれる(サービスの停止操作がかかる)まで
無限ループし、終わらないようにしておく(終わるように作ってしまうと、サービス起動エラーになる)。

stopメソッドではisStoppedフィールドをtrueにする処理のみ行なう。
(あとは、せいぜいログ出力。)

サービスクラス

サービスとして具体的に実行する処理を記述しておく。
(以前ここに『Daemonクラスを実装し、云々』と書いていたが、実はそれをしなくても
できてしまう模様。)

サービスのインストール

バッチファイルにしておくと便利。

zzzservice.exe //IS//ZzzService ^
--DisplayName="Zzz Service" ^
--Description="The test of zzz service" ^
--Install="C:\Temp\ZZZ\zzzservice.exe" ^
--Classpath="C:\Temp\ZZZ\Zzz.jar" ^
--Jvm="C:\Program Files\Java\jdk1.6.0_31\jre\bin\server\jvm.dll" ^
--LogPath="C:\Temp\ZZZ\logs" ^
--StdOutput=auto ^
--StdError=auto ^
--StartClass="zzz.ZzzService" ^
--StartMode=jvm ^
--StartParams=start ^
--StartPath="C:\Temp\ZZZ" ^
--StopClass="zzz.ZzzService" ^
--StopMode=jvm ^
--StopParams=stop ^
--StopPath="C:\Temp\ZZZ"
pause

アンインストールはこちら。

zzzservice.exe //DS//ZzzService
pause

なお、zzzservice.exe はもちろん prunsrv.exe をリネームしたもの。
この例は、インストールフォルダを C:\Temp\ZZZ\ としている。

レジストリ

サービスのインストールを行なうと、レジストリに情報が書き込まれる。
場所は

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation

あたり。
Tomcatのインストール情報もその辺にあるので、比較すると面白い。

.
最終更新:2012年05月08日 13:54