方法4 - WrapperJarApp インテグレーション(Linux / UNIX)

概要

方法4は、アプリケーションの起動に[WrapperJarApp]ヘルパークラスを使う手法です。 これもまたシンプルな Wrapper 統合方法で、アプリケーションが実行可能な「jar」ファイルとして作動するように設定されている場合にご利用いただけます。

この方法を利用するにおいて理解しておくべき点がいくつかあります。 Wrapper が JVM をシャットダウンする際に、直接アプリケーションへシャットダウンをリクエストするわけではなく、 JVM 内部から[System.exit()]メソッドを呼び出して JVM のシャットダウンシーケンスに入ります。 もし、アプリケーションが シャットダウンフック を登録されている場合、通常どおりに実行処理され、アプリケーションがキレイにシャットダウンできる時間を確保します。 その一方、もしシャットダウンフックを登録されていない場合、 コンソール(コマンドウィンドウ)から[CTRL]+[C]のキー操作によるアプリケーション任意停止と同じように動作し、 アプリケーションを直ちに終了させます。シャットダウンフックの有無に関わらず、 いずれのケースでも、Wrapper 導入前の環境状態と同じように動作します。

この方法4([WrapperJarApp]ヘルパークラス)でインテグレーションすると、 [WrapperJarApp]ヘルパークラスがアプリケーションのメインクラスを置き換えます。 これにより、[WrapperJarApp]クラスが、 即時に WrapperManager を初期化する機会を持つことができ、 JVM を Wrapper に登録します。 [WrapperJarApp]クラスは、アプリケーションのライフサイクル(稼働状況)はもちろんのこと、 Wrapper との全ての対話を管理します。 WrapperManager 経由で Wrapper が JVM にスタートメッセージを送ると、 「jar」のマニフェストが詳しく調査され、設定されたメインクラスが呼び出されます。 [WrapperJarApp]が新しく「ClassLoader」を作成し、 そのマニフェストファイルで参照されているその他の「jar」実行ファイルも同様に、 実行可能な「jar」ファイルからクラスをロード(読み込み)することができるようになります。

実行可能な「jar」ファイルの相対参照/絶対参照を引き渡すことで、どのようにアプリケーションを起動するのか、 [WrapperJarApp]ヘルパークラスへ指示が渡され、[WrapperJarApp]のメインメソッドへ その他の追加的なアプリケーションパラメータが続き、進んでいきます。

操作方法の詳細

このセクションでは、さらに詳細に踏み込み、Wrapper 内でアプリケーションを動かすためにはどうするのか、 JBoss 設定方法を例にあげて説明します。 「jar」実行ファイルとしてデプロイされている、 ほとんどのアプリケーションでは、同様の手順でインテグレーションすることができます。

JBoss EAP をインストールする

ここでの解説は、JBoss EAP のクリーンインストールから進める手順で説明します。 ここでは「JBoss EAP 7.0.0 バージョン」を利用していますが、バージョンの違いなどにより手順が部分的に異なる場合があります。 JBoss をダウンロードし、ファイルを解凍してください。このチュートリアルでは「/usr/lib/jboss」フォルダーを利用します。 次に、下記のフォルダーを作成してください。

mkdir /usr/lib/jboss/lib
mkdir /usr/lib/jboss/conf
mkdir /usr/lib/jboss/logs

Wrapper ファイルをインストールする

Wrapper をダウンロードした後、ファイルを解凍してください。こちらでは{WRAPPER_HOME}として参照します。 Wrapper を使えるようにするために4つのディレクトリーを操作する必要があります。

注意

動作しているプラットフォーム用にビルドされた適切なバージョンの Wrapper と「libwrapper.so」を 使用していることを確認してください。 例えば、Wrapper の Linux 版は、Solaris 上では動作しません。

「bin」ディレクトリー

Wrapper には、シェルスクリプト[(sh)]が同封され、 Java Service Wrapper によって制御されているあらゆる Java アプリケーションを確実に起動および停止するために使用できます。

まず、下記ファイルを JBoss の「bin」ディレクトリーにコピーしてください(Wrapper の旧バージョンのファイル名:「sh.script.in」)。

{WRAPPER_HOME}/bin/wrapper
{WRAPPER_HOME}/src/bin/App.sh.in

アプリケーション名を反映して、スクリプトファイル名を変更します。

{JBOSS_HOME}/bin/myJBoss

次にファイルをエディターで開いてください。 JBoss を起動する際のスクリプトで表示が反映されるように、ロング名(長い形式)やショート名(短い形式)を設定が必要です。 スクリプトのヘッダーの直後に、2つの変数 「APP_NAME」と「APP_LONG_NAME」が見えるでしょう。 この変数の推奨された値は次のとおりです。

APP_NAME="jboss"
APP_LONG_NAME="JBoss EAP"

スクリプトは何も追加変更を必要としませんが、コンフィギュレーションファイル 「wrapper.conf」が 一つ上の階層 ../conf/wrapper.conf にある 「conf」ディレクトリーにあるという前提で進めていきます。 もし、その「wrapper.conf」ファイルを他の場所に設置したい場合には、 「WRAPPER_CONF」の変数を適切に設定変更する必要があります。

注意

重要!続行する前に、「bin」ディレクトリー内へコピーされたすべてのファイルに、 実行可能フラグが付いていることを確認してください。

「lib」ディレクトリー

以下の2つのファイルを JBoss の「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」を含みます。 いずれにせよ、拡張子を変更せずにファイルをコピーする必要があります。

「conf」ディレクトリー

Wrapper では各アプリケーション用の設定ファイル(コンフィギュレーションファイル 「wrapper.conf」)が必要です。 その設定ファイルの標準配置ディレクトリーは、 アプリケーションホームディレクトリー下の「conf」ディレクトリーです。 以下の設定ファイルテンプレート「wrapper.conf.in」を JBoss の「conf」ディレクトリーにコピーしてください。

{WRAPPER_HOME}/src/conf/wrapper.conf.in

ファイル名の「.in」拡張子を外して、 ファイル名を「wrapper.conf」へ変更します。

以下のようになるはずです:

{JBOSS_HOME}/conf/wrapper.conf

もしコンフィギュレーションファイル「wrapper.conf」 の配置場所を変更したい場合には、自由に変更して構いませんが、新しい場所が反映されるように、 上記の「bin」ディレクトリーの中に コピーしたスクリプトを変更する必要があります。

「logs」ディレクトリー

デフォルトのコンフィギュレーションファイル 「wrapper.conf」は、 JBoss の「logs」ディレクトリーの中に 「wrapper.log」ファイルを配置します。

{JBOSS_HOME}/logs

もし「wrapper.log」ファイルを他の場所に配置したい場合には、 「wrapper.conf」ファイルを編集して、新しい場所が反映されるように [wrapper.logfile] プロパティを変更する必要があります。

Java コマンドライン

実行可能な「jar」ファイルの Java コマンドラインはとてもシンプルです。 JBoss の場合、「JBoss」ディレクトリーに移動して実行します:

java -jar /usr/lib/jboss/jboss-modules.jar

引数があれば、下記のように引き渡します:(『arg』とは「argument」の略で「引数」の意味です)

java -jar /usr/lib/jboss/jboss-modules.jar arg1 arg2 arg3

コンフィギュレーションファイル「wrapper.conf」の変更

もし、上記のコマンドラインを Wrapper で使うためには、そのコマンドラインのコンポーネントを細分化して、 コンフィギュレーションファイルへ落とし込んでいく必要があります。 「wrapper.conf」 ファイルをエディターで開き、下記のようにプロパティに変更を加えてください。

注意

下記の文中で説明しているプロパティについて、そのリンク先では、それぞれ詳しい説明を提供しています。 じっくり時間をかけて、変更するプロパティの説明を全部、熟読してください。 多くのケースでは、ここでは触れていない事項についても、さらに詳しい使い方の説明があります。

Java 実行ファイル

まず、Java 実行ファイルを解凍して、その配置場所のパスを [wrapper.java.command] プロパティにへ割り当てます。

wrapper.java.command=java

Wrapper Jar

wrapper.jar」ファイルを指定する必要があります。

wrapper.jarfile=/usr/lib/jboss/lib/wrapper.jar

警告

wrapper.jarfile]プロパティは、Wrapper ver. 3.5.55 で導入されました。 それより前の Wrapper バージョンを利用する場合、クラスパスに「wrapper.jar」を追加する必要があります。

wrapper.java.classpath.1=D:\apache-tomcat-9.0.0.M13\lib\wrapper.jar

そして、[wrapper.java.classpath.1]プロパティが重複しないように、次のクラスパス要素のインデックスを調整する必要があります

クラスパス

次にクラスパスです。 [wrapper.java.classpath.<n>] プロパティを使って設定を変更します。 本来 Java では、[-jar]パラメータを使って動作する際に、クラスパスを指定することは認められませんが、 この Wrapper インテグレーションでは少し異なった手法になります。

wrapper.java.classpath.1=/usr/lib/jboss/jboss-modules.jar

メインクラス

Wrapper や [WrapperJarApp]ヘルパークラスを使う際に、 Java は「jar」ファイルを直接的に実行しません。 アプリケーションのメインクラスとして、ヘルパークラスを指定する必要があります。 起動時に Java によって実行されるこのメインクラスは、 [wrapper.java.mainclass] プロパティを使って指定します。

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

アプリケーションパラメータ

アプリケーションパラメータは、 [wrapper.app.parameter.<n>] プロパティを使って設定します。 ここでのケースでは、JBoss を起動させるコマンドラインは、いくつかのアプリケーションパラメータを必要とします。 [WrapperJarApp]ヘルパークラスに、どの「jar」ファイルを 実行させるのか伝える必要があります。 下記のように設定します:

wrapper.app.parameter.1=/usr/lib/jboss/jboss-modules.jar
wrapper.app.parameter.2=-mp
wrapper.app.parameter.3=/usr/lib/jboss/modules
wrapper.app.parameter.4=-jaxpmodule
wrapper.app.parameter.5=javax.xml.jaxp-provider
wrapper.app.parameter.6=org.jboss.as.standalone
wrapper.app.parameter.7=-Djboss.home.dir=/usr/lib/jboss
wrapper.app.parameter.8=-Djboss.server.base.dir=/usr/lib/jboss/standalone

Java 追加パラメータ

Java 追加パラメータを設定するには、 [wrapper.java.additional.<n>]プロパティを 使います。 JBoss を正しく起動するために、いくつかのパラメータを設定する必要があります。

wrapper.java.additional.1=-D"[Standalone]"
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:+UseCompressedOops
wrapper.java.additional.4=-Xms1303M
wrapper.java.additional.5=-Xmx1303M
wrapper.java.additional.6=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.7=-Djboss.modules.system.pkgs=org.jboss.byteman
wrapper.java.additional.8=-Djava.awt.headless=true
wrapper.java.additional.9=-Dorg.jboss.boot.log.file=/usr/lib/jboss/standalone/log/server.log
wrapper.java.additional.10=-Dlogging.configuration=file:/usr/lib/jboss/standalone/configuration/logging.properties
wrapper.java.additional.11=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=false
wrapper.java.additional.12=-Djava.util.logging.manager=org.jboss.logmanager.LogManager
wrapper.java.additional.13=-Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl

ライブラリーパス

Wrapper を使うために、設定しなければならないプロパティがもう一つあります。 システムとの対話をコントロールするため、Wrapper は、ネイティブライブラリーを利用します。 このライブラリーファイル「libwrapper.so」は、 JVM へ供給されるライブラリーパスで指定しておく必要があります。

JBoss では、ネイティブライブラリーを一切持ちません。 仮にあったとしても、それがどこに位置するのかライブラリーの配置場所(ディレクトリー)を指定しておく必要があるでしょう。 ライブラリーパスは、 [wrapper.java.library.path.<n>] プロパティを使って設定します。

wrapper.java.library.path.1=/usr/lib/jboss/lib

全部をまとめる

全部をまとめると、下記のようになります:

wrapper.java.command=java

wrapper.jarfile=/usr/lib/jboss/lib/wrapper.jar

wrapper.java.classpath.1=/usr/lib/jboss/jboss-modules.jar

wrapper.java.library.path.1=/usr/lib/jboss/lib

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

wrapper.java.additional.1=-D"[Standalone]"
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:+UseCompressedOops
wrapper.java.additional.4=-Xms1303M
wrapper.java.additional.5=-Xmx1303M
wrapper.java.additional.6=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.7=-Djboss.modules.system.pkgs=org.jboss.byteman
wrapper.java.additional.8=-Djava.awt.headless=true
wrapper.java.additional.9=-Dorg.jboss.boot.log.file=/usr/lib/jboss/standalone/log/server.log
wrapper.java.additional.10=-Dlogging.configuration=file:/usr/lib/jboss/standalone/configuration/logging.properties
wrapper.java.additional.11=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=false
wrapper.java.additional.12=-Djava.util.logging.manager=org.jboss.logmanager.LogManager
wrapper.java.additional.13=-Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl

wrapper.app.parameter.1=/usr/lib/jboss/jboss-modules.jar
wrapper.app.parameter.2=-mp
wrapper.app.parameter.3=/usr/lib/jboss/modules
wrapper.app.parameter.4=-jaxpmodule
wrapper.app.parameter.5=javax.xml.jaxp-provider
wrapper.app.parameter.6=org.jboss.as.standalone
wrapper.app.parameter.7=-Djboss.home.dir=/usr/lib/jboss
wrapper.app.parameter.8=-Djboss.server.base.dir=/usr/lib/jboss/standalone

これらの設定をしたテストマシンが正常に動作していることからも分かるように、 ディレクトリー構造やプラットフォームに非常に高く依存しています。 Wrapper が作業ディレクトリーを常に 「wrapper.exe」ファイルが 存在する場所に設定するという仕組みの利点を生かし、 また、一つの環境変数を利用することで、上記のプロパティを変更することができますので、 完全にプラットフォームやマシンが依存しない独立型の状態となりえるのです。

set.JBOSS_HOME=/usr/lib/jboss

wrapper.java.command=%JAVA_HOME%/bin/java

wrapper.jarfile=../lib/wrapper.jar

wrapper.java.classpath.1=../jboss-modules.jar

wrapper.java.library.path.1=../lib

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

wrapper.java.additional.1=-D"[Standalone]"
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:+UseCompressedOops
wrapper.java.additional.4=-Xms1303M
wrapper.java.additional.5=-Xmx1303M
wrapper.java.additional.6=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.7=-Djboss.modules.system.pkgs=org.jboss.byteman
wrapper.java.additional.8=-Djava.awt.headless=true
wrapper.java.additional.9=-Dorg.jboss.boot.log.file=%JBOSS_HOME%/standalone/log/server.log
wrapper.java.additional.10=-Dlogging.configuration=file:%JBOSS_HOME%/standalone/configuration/logging.properties
wrapper.java.additional.11=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=false
wrapper.java.additional.12=-Djava.util.logging.manager=org.jboss.logmanager.LogManager
wrapper.java.additional.13=-Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl

wrapper.app.parameter.1=../jboss-modules.jar
wrapper.app.parameter.2=-mp
wrapper.app.parameter.3=%JBOSS_HOME%/modules
wrapper.app.parameter.4=-jaxpmodule
wrapper.app.parameter.5=javax.xml.jaxp-provider
wrapper.app.parameter.6=org.jboss.as.standalone
wrapper.app.parameter.7=-Djboss.home.dir=%JBOSS_HOME%
wrapper.app.parameter.8=-Djboss.server.base.dir=%JBOSS_HOME%/standalone

試しに動かしてみる

ここまで来れば、単純に「bin/myJBoss console」スクリプトを実行することで JBoss を動かすことができます。 Wrapper がカレントディレクトリーを設定してくれるお陰で、 「bin」ディレクトリー内部から、このスクリプトを実行する必要はありません。

ご覧のとおり、コマンドを省略すると、Wrapper に同梱して提供しているスクリプトは、極めて標準的なデーモンスクリプトです。 [console]、 [start]、 [stop]、 [restart]、 [dump] コマンドを受け付ます。

  • start]、 [stop]、 [restart]コマンドは、ほとんどのデーモンスクリプトでは 一般的なもので、Wrapper やデーモンプロセスとしてのアプリケーションをコントロールするために使われます。
  • status]コマンドは、Wrapper が現在稼働中かどうか検知するために使われます。
  • console]コマンドは、カレントシェル内で、Wrapper を起動し、[CTRL]+[C]のキー操作でアプリケーションを任意停止することを可能にします。
  • dump]コマンドは、JVM にフルスレッドダンプをさせるように仕向けるために、 Wrapper へ「kill -3」シグナルを送ります。

おめでとう!あなたのアプリケーションが起動して動き始めるはずです。

もし何か問題があった場合、トラブルシューティングをご覧いただき、 問題点を追究するのに役立つことでしょう。