daybreaksnow's diary

私を私と呼びたい

[Java]JavaプログラムをWindowsでサービスとして起動する

Java Service Wrapperを使って、前回作成したjarをWindowsサービスにして実行する。
(コンソール出力を行うだけのプログラムなのでサービスにする意味は全くないが。)

以下のページを参考にした
http://wrapper.tanukisoftware.com/doc/japanese/qna-service.html
※公式トップのサポート→質問と回答→JavaアプリケーションをWindowsサービスの1つとして動かすには?

1.Java Service Wrapperのダウンロード

以下からWindows x86 スタンダード版 64bitをダウンロード
http://wrapper.tanukisoftware.com/doc/japanese/download.jsp

2.ディレクトリの準備

サンプルプログラムを以下に配置した

App
  bin
    springSample.jar

3.wrapperの必要なファイルのコピー

1.でダウンロードしたzipを展開し、必要なファイルを以下の通りコピーする。
また、ログファイル用にlogsディレクトリを作っておく

bin/wrapper.exe			→ App/bin
lib/wrapper.jar			→ App/lib
lib/wrapper.dll			→ App/lib
src/conf/wrapper.conf.in	→ App/conf/wrapper.conf
src/conf/wrapper-license-time.conf→ App/conf/wrapper-license-time.conf
src/bin/App.bat.in		→ bin/App.bat
src/bin/InstallApp-NT.bat.in	→ bin/InstallApp-NT.bat
src/bin/UninstallApp-NT.bat.in	→ bin/UninstallApp-NT.bat

最終的なディレクトリ構成は以下の通り

ServiceWrapperSample
  bin
    springSample.jar
    wrapper.exe
    App.bat
    InstallApp-NT.bat
    UninstallApp-NT.bat
  lib
    wrapper.jar
    wrapper.dll
  conf
    wrapper.conf
    wrapper-license.conf
  logs

4.wrapper.confの修正

クラスパスの追加

実行するJarファイルを指定

wrapper.java.classpath.2=springSample.jar
エントリクラスの設定

完全修飾子で指定

wrapper.app.parameter.1=spring.sample.SpringSample
サービス名の設定

以下を適当に設定

wrapper.name=SpringSample_servicename
wrapper.displayname=SpringSample_dispname
wrapper.description=SpringSample_description

5.動作確認

bin/App.batを実行
出力はlogs/wrapper.logに吐かれる

6.サービス化と解除

bin/InstallApp-NT.batを実行。
自分の環境では以下のメッセージが出力されたが、サービスには登録されていた。

Failed to write to console: ハ

サービス化の解除はbin/UninstallApp-NT.batを実行すればOK

その他Tips

Javaプログラム引数の追加

wrapper.app.parameter.2=spring-conf_test.xml

VM引数は以下

wrapper.java.additional.1=

Javaのヒープメモリ最大値設定(※これはVM引数に-Xmx指定するのと同じなのだろうか?)

wrapper.java.maxmemory=1024


なお、前回のjar出力方法で、以下のどちらでも上記の設定で動作した。

1.生成されるJARに必須ライブラリーを抽出
3.生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー

3.については、bin以下にlibフォルダを追加し、エクスポート時と同じディレクトリ構成にした。
もしlibフォルダの場所を変える場合は、以下のようにwrapper.confにクラスパスを追加する事で対応できる。

wrapper.java.classpath.3=../lib/spring.jar
wrapper.java.classpath.4=../lib/commons-logging.jar