ことの発端
Tomcat 7 では Windows 用の配布物をダウンロードした場合サービスに登録する際は次の要領で %CATALINA_HOME¥bin¥service.bat を実行するだけ。C:\>%CATALINA_HOME%\bin\service.bat install Installing the service 'Tomcat7' ... Using CATALINA_HOME: C:\Program Files\Tomcat\tomcat7 Using CATALINA_BASE: C:\Program Files\Tomcat\tomcat7 Using JAVA_HOME: Using JVM: auto The service 'Tomcat7' has been installed.
でも、何らかの理由で Windows 用のではない配布物をダウンロードしてしまった場合や変更が加えられた二次配布 Tomcat を使用する場合、あるいは service.bat を管理者権限で実行出来ない場合など、別の方法でサービス登録をしなくちゃいけない。
どうやるんだろう?
Windows インストーラではどのようにサービス登録しているか
まず Tomcat は本来どのようにサービス登録しているか見てみる。windows インストーラで Tomcat 7.0.2 をインストールしてみると %CATALINA_HOME¥bin に
Tomcat7.exe Tomcat7w.exe bootstrap.jar tomcat-juli.jar
のみ含まれている。
色々調べてみると、この Tomcat7.exe, Tomcat7w.exe は Apache commons daemon で配布されている Procrun.exe を rename したものらしい( see at http://commons.apache.org/daemon/procrun.html )。基本的にはこの Procrun.exe を使えばサービスに登録出来そう。
Tomcat で使用しているパラメータを調べる
Tomcat は独自にパラメータを付与している可能性があるので、Taomcat のマニュアル Windows service HOW-TO を参考にする。と、このマニュアルの前半はどうやら Procrun のマニュアルをそのままコピーしただけの様なので Installing_services から読み始める。
ちょうど良くコマンド例が記載されているのでこれを実行。
C:\> tomcat7 //IS//Tomcat7 --DisplayName="Apache Tomcat 7" \ C:\> --Install="C:\Program Files\Tomcat\bin\tomcat7.exe" --Jvm=auto \ C:\> --StartMode=jvm --StopMode=jvm \ C:\> --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start \ C:\> --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop c:\>
何のエラーも無くすんなり完了。
試しに Tomcat7 サービスを起動してみると…
Tomcat7 は次のサービス固有のエラーで終了しました: 0 (0x0)
と、エラーが発生して起動せぬまま終了。
イベントビューアを見てみても同じログしか出力されていない。
…もしかしたらパラメータが足りないのかも知れない…。
もう一度、サービス登録時に付与したパラメータを確認すると StartClass と StopClass を指定しているのに Class Path を指定していない。パラメータを追加するためマニュアルの Updating services を見てみると、ClassPath パラメータ付与してるし!最初から付与しておいてよ orz
C:\> tomcat7 //US//Tomcat7 --Description="Apache Tomcat Server - http://tomcat.apache.org/ " \ C:\> --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar
と、サービスを更新して再度起動してみる・・・。
Tomcat 7 サービスは予期せず終了しました。(エラー 1067)
がっかり。
まだパラメータが足りないのかと思い、マニュアルを読み進めてみたが何も記載が無い。
イベントビューアを見てみたけれど上記と同じログが出力されているだけ。
いよいよお手上げ。
Windows インストーラとの違いを探る
同じ EXE を使っているのだから同様にサービス登録できるはず!ということで、一度 Windows インストーラでレジストリに登録された情報を見てみる。
と、HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java に次の Options というパラメータがあるのに対して、手動で登録したものにはこのパラメータがない。
どうやらこれが肝らしい。
-Dcatalina.home=C:\Program Files\Tomcat; -Dcatalina.base=C:\Program Files\Tomcat; -Djava.endorsed.dirs=C:\Program Files\Tomcat\endorsed; -Djava.io.tmpdir=C:\Program Files\Tomcat\temp; -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager; -Djava.util.logging.config.file=C:\Program Files\Tomcat\conf\logging.properties;
このパラメータの値は ";" で区切られていて、それぞれの頭に "-D" が付いている。
これは --JvmOptions で付与すべきなのかな。
とりあえずやってみた。
C:> sc delete Tomcat7 C:> tomcat7 //IS//Tomcat7 --DisplayName="Tomcat7" --Jvm="C:\Program Files\Java\jdk1.6.0_18\jre\bin\server\jvm.dll" --JvmOptions="-Dcatalina.home=C:\Program Files\Tomcat;-Dcatalina.base=C:\Program Files\Tomcat;-Djava.endorsed.dirs=C:\Program Files\Tomcat\endorsed;-Djava.io.tmpdir=C:\Program Files\Tomcat\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=C:\Program Files\ApacheGroup\apache-tomcat-7.0.2\conf\logging.properties" --Classpath="C:\Program Files\Java\jdk1.6.0_18\lib\tools.jar;C:\Program Files\Apache Group\apache-tomcat-7.0.2\bin\bootstrap.jar;C:\Program Files\Tomcat\bin\tomcat-juli.jar" --StartMode=jvm --StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop --Startup=auto
何のエラーも無くすんなり完了。
試しに Tomcat7 サービスを起動してみると…無事起動。
まとめ
今回の結果を次にまとめてみた。- サービス登録には Procrun を使う
- 基本登録コマンドは Installing_services に記載されているコマンドを使用
- さらに --ClassPath オプションで JVM と bin に含まれている jar を加える
- さらに --JvmOptions オプションでシステムパラメータを加える
apache-tomcat-7.0.37.exe と jdk-7u17の組合せで、startup.batでは起動するのに、service.batで登録したサービスが
返信削除FindClass org/apache/catalina/startup/Bootstrap failed
と起動しないという状況に陥っており、しらべているうちにこちらにたどり着きました。
海外でも多数質問が上がっているようですが、明確な解決は見つかりませんでした。
こちらのブログを参照しせ設定しました結果、うまくサービスが起動するようになりましたので、お礼と共に、他にも困っている方のために解決方法を記載させて下さい。
service.bat を使用しtomcatをサービスとして登録しても、サービスがエラーで開始できない場合、
まず、環境変数に%CATALINA_HOME%、%JAVA_HOME%が設定されていること、
%JAVA_HOME%\binにパスが通っていることを確認して下さい。
コマンドプロンプトより
%CATALINA_HOME%\bin\tomcat7w.exe //ES
でTomcat7のPropatiesのダイアログを出して、
Javaのタブの中の
Java Classpathに
%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\tomcat-juli.jar
をいれて、OKを押して下さい。
これでTomcatのServiceが開始できるようになると思います。
@kioさんありがとうございました。