方法4は、アプリケーションの起動に[WrapperJarApp]ヘルパークラスを使う手法です。 これもまたシンプルなWrapper統合方法で、アプリケーションの設定が既に完了していて、 実行可能な「jar」ファイルの準備が整っている場合にご利用いただけます。
この方法を利用するにおいて理解しておくべき点がいくつかあります。 WrapperがJVM(Javaバーチャルマシン)をシャットダウンする際に、直接アプリケーションへシャットダウンをリクエストするわけではなく、 JVM内部から[System.exit()]メソッドを呼び出してJVMのシャットダウン・シーケンスに入ります。 もし、アプリケーションが シャットダウン・フック に登録されている場合、 通常どおりに実行処理され、アプリケーションがキレイにシャットダウンできる時間を確保します。 その一方、もしシャットダウン・フックに登録されていない場合、 コンソール(コマンド・ウィンドウ)から[CTRL]+[C]のキー操作によるアプリケーション任意停止と同じように動作し、 アプリケーションを直ちに終了させます。シャットダウン・フックの有無に関わらず、 いずれのケースでも、Wrapper導入前の環境状態と同じように動作します。
この方法4([WrapperJarApp]ヘルパークラス)でインテグレーションすると、 [WrapperJarApp]クラスがアプリケーションのメイン・クラスを置き換えます。 これにより、[WrapperJarApp]クラスが、 即時にWrapperManagerを初期化する機会を持つことができ、 JVM(Javaバーチャルマシン)をWrapperに登録します。 [WrapperJarApp]クラスは、アプリケーションのライフサイクル(稼働状況)はもちろんのこと、 Wrapperとの全ての対話を管理します。 WrapperManager経由でWrapperがスタート・メッセージをJVMに送ると、 「jar」の目録が詳しく調査され、変更されたメイン・クラスが呼び出されます。 [WrapperJarApp]が新しく「ClassLoader」を作成し、 その目録を参照しているその他の「jar」ファイルも同様に、 実行可能な「jar」ファイルクラスをロード(読み込み)することができるようになります。
実行可能な「jar」ファイルの相対参照/絶対参照を引き渡すことで、 どのようにアプリケーションを起動するのか、 [WrapperJarApp]ヘルパークラスへ指示が渡され、 [WrapperJarApp]のメイン・メソッドへ その他の追加的なアプリケーション・パラメータが続き、進んでいきます。
このセクションでは、さらに詳細に踏み込み、Wrapper内でアプリケーションを動かすためにはどうするのか、 Hudson設定方法、インテグレーション・エンジンを例にあげて説明します。 実行可能な「jar」ファイルとしてデプロイされている、 ほとんどのアプリケーションでは、同様の手順でインテグレーションすることができます。
ここでの解説は、Hudsonのクリーン・インストールから進める手順で説明します。 ここでは「Hudsonバージョン1.285」を利用していますが、 バージョンの違いなどにより手順が部分的に異なる場合があります。 Hudsonは、「hudson.war」というファイル名でデプロイされています。 これで、ウェブ・アプリケーションとしてデプロイされることを可能にさせますが、 実行可能な「jar」ファイルになっています。 Hudsonは「/usr/lib/hudson」ディレクトリーにインストールされています。 「bin」 「lib」 「conf」 「logs」の各ディレクトリーを作成して、 「lib」ディレクトリー内に [hudson.war]ファイルを置いてください。
Wrapperを使えるようにするために4つのディレクトリーを操作する必要があります。
動作しているプラットフォーム用にビルドされた適切なバージョンのWrapperと 「libwrapper.so」ファイルであることを確認してください。 例えば、Wrapper Linux版は、Solaris上では動作しません。
Wrapperにシェルスクリプト(sh)を同梱して提供しており、 それを使うことで、JavaアプリケーションをJava Service Wrapperでコントロールし、 確実に開始したり停止したりすることができます。
まず始めに、以下のファイルをHudsonの「bin」ディレクトリーにコピーしてください:
{WRAPPER_HOME}/bin/wrapper {WRAPPER_HOME}/src/bin/sh.script.in
アプリケーション名を反映してスクリプト・ファイル名を変更します。
{HUDSON_HOME}/bin/hudson
次に、エディターで、そのスクリプトを開きます。 Hudsonを起動する際のスクリプトで表示が反映されるように、 ロング名やショート名を設定が必要です。スクリプトのヘッダーの直後に、 2つの変数[APP_NAME]と[APP_LONG_NAME]が見えるでしょう。 この変数の推奨された値は次のとおりです。
APP_NAME="hudson" APP_LONG_NAME="Hudson Integration Engine"
このスクリプトは、何も設定変更を必要としませんが、コンフィギュレーション・ファイル 「wrapper.conf」が 「conf」ディレクトリーにあるという前提で進めていきます。 もし、その「wrapper.conf」ファイルを他の場所に設置したい場合には、 そのスクリプト内の[WRAPPER_CONF]変数を変更する必要があります。
重要! 処理を進める前に、処理を進める前に、 「bin」ディレクトリーにコピーした全てのファイルが、 実行可能なビット・セットになっていることを確認してください。
以下の2つのファイルをHudsonの「lib」ディレクトリーにコピーしてください:
{WRAPPER_HOME}/lib/libwrapper.so {WRAPPER_HOME}/lib/wrapper.jar
「libwrapper.so」ファイルは、 ネイティブ・ライブラリー・ファイルであり、 JVM内で動作するWrapperの一部として必要なものです。 「wrapper.jar」ファイルには、全てのWrapperクラスが含まれています。
プラットフォームの違いにより、それぞれのネーミングの慣習に従い、 ネイティブ・ライブラリーの名前が少し異なることもありますので注意してください。 可能性のある名前は、 「libwrapper.a」、 「libwrapper.sl」、 「libwrapper.so」、 「libwrapper.jnilib」です。 いずれの場合でも、ファイルの拡張子を変更せずコピーしてください。
Wrapperでは各アプリケーション用の設定ファイル(コンフィギュレーション・ファイル 「wrapper.conf」)が必要です。 その設定ファイルの標準配置ディレクトリーは、 アプリケーション・ホーム・ディレクトリー下の「conf」ディレクトリーです。 以下の設定ファイル・テンプレート「wrapper.conf.in」を Hudsonの「conf」ディレクトリーにコピーしてください:
{WRAPPER_HOME}/src/conf/wrapper.conf.in
次のようにファイル名を変更します。 拡張子「.in」を外して、 ファイル名を「wrapper.conf」へ変更します。
以下のようになるはずです:
{HUDSON_HOME}/conf/wrapper.conf
もしコンフィギュレーション・ファイル「wrapper.conf」 の配置場所を変更したい場合には、自由に変更して構いませんが、新しい場所が反映されるように、 上記の「bin」ディレクトリーの中に コピーしたスクリプトを変更する必要があります。
コンフィギュレーション・ファイル 「wrapper.conf」 のデフォルトでは、アプリケーション・ホーム・ディレクトリー下にある 「logs」ディレクトリーの中に 「wrapper.log」ファイルを配置します。
{HUDSON_HOME}/logs
もし「wrapper.log」ファイルを他の場所に配置したい場合には、 「wrapper.conf」ファイルを編集して、新しい場所が反映されるように [wrapper.logfile] プロパティを変更する必要があります。
実行可能な「jar」ファイルの場合、Java コマンドラインはシンプルです。 Hudsonの場合、「Hudson」ディレクトリーに移動して実行します:
java -jar /usr/lib/hudson/lib/hudson.war
引数があれば、下記のように引き渡します: (『arg』とは「argument」の略で「引数」の意味です)
java -jar /usr/lib/hudson/lib/hudson.war arg1 arg2 arg3
もし、上記のコマンドラインをWrapperで使うためには、そのコマンドラインのコンポーネントを細分化して、 コンフィギュレーション・ファイルへ落とし込んでいく必要があります。 「wrapper.conf」 ファイルをエディターで開き、下記のようにプロパティに変更を加えてください。
下記の文中で説明しているプロパティについて、そのリンク先では、それぞれ詳しい説明を提供しています。 じっくり時間をかけて、変更するプロパティの説明を全部、熟読してください。 多くのケースでは、ここでは触れていない事項についても、さらに詳しい使い方の説明があります。
まず、Java実行ファイルを解凍して、その配置場所のパスを [wrapper.java.command] プロパティにへ割り当てます:
wrapper.java.command=java
次にクラスパスです。 [wrapper.java.classpath.<n>] プロパティを使って設定を変更します。 本来Javaでは、[-jar]パラメータを使って動作する際に、クラスパスを指定することは認められませんが、 このWrapperインテグレーションでは少し異なった手法になります。 Wrapperでは、その「wrapper.jar」ファイルをクラスパスの中に指定する必要があります:
wrapper.java.classpath.1=/usr/lib/hudson/lib/wrapper.jar
Wrapper や [WrapperJarApp]ヘルパークラスを使う際に、 Javaは「jar」ファイルを直接的に実行しません。 アプリケーションのメイン・クラスとして、ヘルパークラスを指定する必要があります。 起動時にJavaによって実行されるこのメイン・クラスは、 [wrapper.java.mainclass] プロパティを使って指定します。
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp
アプリケーション・パラメータは、 [wrapper.app-parameter.<n>] プロパティを使って設定します。 ここでのケースでは、 Hudsonを起動させるコマンドラインは、 アプリケーション・パラメータを何も指定していませんが、 [WrapperJarApp]ヘルパークラスに、どの「jar」ファイルを実行させるのか伝える必要があります。 下記のように設定します:
wrapper.app.parameter.1=/usr/lib/hudson/lib/hudson.war
Wrapperを使うために、設定しなければならないプロパティがもう一つあります。 システムとの対話をコントロールするため、Wrapperは、ネイティブ・ライブラリーを利用します。 このライブラリー・ファイル 「libwrapper.so」は、 JVMへ供給されるライブラリーパスで指定しておく必要があります。
Hudson では、ネイティブ・ライブラリーを一切持ちません、 仮にあったとしても、 それがどこに位置するのかライブラリーの 配置場所(ディレクトリー)を指定しておく必要があるでしょう。 ライブラリーパスは、 [wrapper.java-library-path.<n>] プロパティを使って設定します。
wrapper.java.library.path.1=/usr/lib/hudson/lib
全部をまとめると、下記のようになります:
wrapper.java.command=java wrapper.java.classpath.1=/usr/lib/hudson/lib/wrapper.jar wrapper.java.library.path.1=/usr/lib/hudson/lib wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp wrapper.app.parameter.1=/usr/lib/hudson/lib/hudson.war
これらの設定をしたマシンが正常に動作していることからも分かるように、 ディレクトリー構造やプラットフォームに非常に高く依存しています。 Wrapperのスクリプトにより常にそのスクリプトの位置を カレント・ディレクトリーとして設定するという仕組みの利点を生かし、 また、一つの環境変数を利用することで、上記のプロパティを変更することができるので、 完全にプラットフォームやマシンが依存しない独立型の状態となりえるのです:
wrapper.java.command=%JAVA_HOME%/bin/java wrapper.java.classpath.1=../lib/wrapper.jar wrapper.java.library.path.1=../lib wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp wrapper.app.parameter.1=../lib/hudson.war
ここまで来れば、単純に 「bin/hudson console」スクリプトを実行することで Hudsonを動かすことができます。 Wrapperがカレント・ディレクトリーを設定してくれるお陰で、 「bin」ディレクトリー内部から、このスクリプトを実行する必要はありません。
ご覧のとおり、コマンドを省略すると、 Wrapperに同梱して提供しているスクリプトは、 極めて標準的なデーモン・スクリプトで、 [console], [start], [stop], [restart], [dump] コマンドを受け付ます。 [start], [stop], [restart] コマンドは、ほとんどのデーモン・スクリプトでは一般的なもので、 Wrapperや、デーモン・プロセスとしてのアプリケーションを、コントロールするために使われます。 [status] コマンドは、Wrapperが現在稼働中かどうか検知するために使われます。 [console] コマンドは、カレント・シェル内で、Wrapperを起動し、 [CTRL]+[C]のキー操作でアプリケーションを任意停止することを可能にします。 [dump] コマンドは、JVMにフルスレッドダンプをさせるように仕向けるために、 Wrapperへ「kill -3」シグナルを送ります。
おめでとう!あなたのアプリケーションが起動して動き始めるはずです。
もし何か問題があった場合、トラブルシューティングをご覧いただき、 問題点を追究するのに役立つことでしょう。