- はじめに
- Managerアプリケーションアクセスの設定
- HTMLユーザーフレンドリーインターフェース
- サポートされているManagerコマンド
- サーバー状態
- JMXプロキシサーブレットの使用
- Antを使用したManagerコマンドの実行
Manager アプリケーションの使い方
目次
はじめに
多くの本番環境では、コンテナ全体をシャットダウンして再起動することなく、新しいWebアプリケーションを展開したり、既存のWebアプリケーションをアンデプロイしたりする機能があると非常に便利です。さらに、Tomcatサーバー設定ファイルでreloadable
として宣言していなくても、既存のアプリケーションに自身のリロードを要求できます。
これらの機能をサポートするために、TomcatにはWebアプリケーション(デフォルトでコンテキストパス/manager
にインストールされています)が含まれており、次の機能をサポートしています。
- WARファイルのアップロードされたコンテンツから新しいWebアプリケーションを展開します。
- 指定されたコンテキストパスで、サーバーファイルシステムから新しいWebアプリケーションを展開します。
- 現在展開されているWebアプリケーションと、それらのWebアプリで現在アクティブなセッションをリスト表示します。
/WEB-INF/classes
または/WEB-INF/lib
の内容の変更を反映するために、既存のWebアプリケーションをリロードします。- OSとJVMのプロパティ値をリスト表示します。
<Context>
展開記述子にネストされた<ResourceLink>
要素を準備している展開ツールで使用するために、使用可能なグローバルJNDIリソースをリスト表示します。- 停止したアプリケーションを開始します(したがって、再び使用可能になります)。
- 既存のアプリケーションを停止します(使用できなくなりますが、アンデプロイはしません)。
- 展開されたWebアプリケーションをアンデプロイし、そのドキュメントベースディレクトリを削除します(ファイルシステムから展開された場合を除く)。
デフォルトのTomcatインストールには、デフォルトの仮想ホストに対して構成されたManagerアプリケーションのインスタンスが含まれています。追加の仮想ホストを作成する場合は、これらのホストの1つ以上にManagerアプリケーションのインスタンスを追加することをお勧めします。Manager WebアプリケーションContext
のインスタンスを新しいホストに追加するには、manager.xml
コンテキスト設定ファイルを$CATALINA_BASE/conf/[enginename]/[hostname]
フォルダにインストールします。例を以下に示します。
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
**Manager** Webアプリケーションを使用する方法は3つあります。
- ブラウザで使用できるユーザーインターフェースを備えたアプリケーションとして。ここで、
localhost
をWebサイトのホスト名に置き換えることができるURLの例を示します:http://localhost:8080/manager/html
。 - HTTPリクエストのみを使用する最小限のバージョンで、システム管理者によって設定されたスクリプトで使用できます。コマンドはリクエストURIの一部として与えられ、応答は簡単に解析および処理できる単純なテキスト形式です。詳細については、サポートされているManagerコマンドを参照してください。
- Ant(バージョン1.4以降)ビルドツール用の便利なタスク定義のセット。詳細については、Antを使用したManagerコマンドの実行を参照してください。
Managerアプリケーションアクセスの設定
以下の説明では、変数名$CATALINA_BASEを使用して、ほとんどの相対パスが解決される基準ディレクトリを参照します。$CATALINA_BASEディレクトリを設定することでTomcatを複数のインスタンス用に構成していない場合は、$CATALINA_BASEは$CATALINA_HOME(Tomcatをインストールしたディレクトリ)の値に設定されます。
インターネット上の誰でもサーバー上のManagerアプリケーションを実行できるようにするデフォルト設定でTomcatを出荷することは非常に危険です。したがって、Managerアプリケーションは、それを使用しようとするすべての人が、**manager-xxx**ロールのいずれかが関連付けられたユーザー名とパスワードを使用して自分自身を認証する必要があるという要件を伴って出荷されます(ロール名は必要な機能によって異なります)。さらに、デフォルトのユーザーファイル($CATALINA_BASE/conf/tomcat-users.xml
)には、これらのロールに割り当てられたユーザー名は存在しません。したがって、デフォルトでは、Managerアプリケーションへのアクセスは完全に無効になっています。
ロール名は、Manager Webアプリケーションのweb.xml
ファイルにあります。使用可能なロールは次のとおりです。
- manager-gui — HTMLインターフェースへのアクセス。
- manager-status — 「サーバー状態」ページのみへのアクセス。
- manager-script — このドキュメントで説明されているツールフレンドリーなプレーンテキストインターフェースと「サーバー状態」ページへのアクセス。
- manager-jmx — JMXプロキシインターフェースと「サーバー状態」ページへのアクセス。
HTMLインターフェースはCSRF(クロスサイトリクエストフォージェリ)攻撃から保護されていますが、テキストインターフェースとJMXインターフェースは保護できません。つまり、テキストインターフェースとJMXインターフェースへのアクセスが許可されているユーザーは、WebブラウザでManagerアプリケーションにアクセスする際には注意する必要があります。CSRF保護を維持するには
- manager-scriptまたはmanager-jmxロールを持つユーザー(たとえば、プレーンテキストまたはJMXインターフェースをテストするため)を使用してWebブラウザでManagerアプリケーションにアクセスする場合は、セッションを終了するために、その後ブラウザのすべてのウィンドウを閉じなければなりません。ブラウザを閉じずに他のサイトにアクセスすると、CSRF攻撃の被害者になる可能性があります。
- manager-guiロールを持つユーザーにmanager-scriptまたはmanager-jmxロールを付与しないことをお勧めします。
JMXプロキシインターフェースは、事実上、Tomcatの低レベルのルートのような管理インターフェースです。どのようなコマンドを呼び出すかを知っていれば、多くのことができます。manager-jmxロールを有効にする際には注意する必要があります。
Manager Webアプリケーションへのアクセスを有効にするには、新しいユーザー名/パスワードの組み合わせを作成してmanager-xxxロールのいずれかを関連付けるか、既存のユーザー名/パスワードの組み合わせにmanager-xxxロールを追加する必要があります。このドキュメントの大部分はテキストインターフェースの使用について説明しているため、この例ではロール名manager-scriptを使用します。ユーザー名/パスワードの設定方法は、使用しているレルムの実装によって異なります。
- UserDatabaseRealm + MemoryUserDatabase、またはMemoryRealm — UserDatabaseRealmとMemoryUserDatabaseは、デフォルトの
$CATALINA_BASE/conf/server.xml
で構成されています。MemoryUserDatabaseとMemoryRealmの両方が、デフォルトで$CATALINA_BASE/conf/tomcat-users.xml
に格納されているXML形式のファイルを読み取ります。このファイルは、任意のテキストエディターで編集できます。このファイルには、各ユーザーごとにXML<user>
が含まれており、次のようになります。これは、このユーザーがログインに使用したユーザー名とパスワード、および関連付けられているロール名を定義しています。既存のユーザーのコンマ区切り<user username="craigmcc" password="secret" roles="standard,manager-script" />
roles
属性にmanager-scriptロールを追加したり、そのロールが割り当てられた新しいユーザーを作成したりできます。 - DataSourceRealm — ユーザーとロール情報は、JDBCを介してアクセスされるデータベースに格納されます。環境の標準手順に従って、既存のユーザーにmanager-scriptロールを追加したり、このロールが割り当てられた新しいユーザーを1人以上作成したりします。
- JNDIRealm — ユーザーとロール情報は、LDAPを介してアクセスされるディレクトリサーバーに格納されます。環境の標準手順に従って、既存のユーザーにmanager-scriptロールを追加したり、このロールが割り当てられた新しいユーザーを1人以上作成したりします。
次のセクションで説明されているManagerコマンドのいずれかを初めて発行しようとすると、BASIC認証を使用してログインするように要求されます。manager-scriptロールを持つユーザーデータベース内の有効なユーザーを識別する限り、入力するユーザー名とパスワードは関係ありません。
パスワードの制限に加えて、RemoteAddrValve
またはRemoteHostValve
を追加することで、**リモートIPアドレス**またはホストによってManager Webアプリケーションへのアクセスを制限できます。詳細については、バルブのドキュメントを参照してください。IPアドレスでlocalhostへのアクセスを制限する例を以下に示します。
<Context privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>
HTMLユーザーフレンドリーインターフェース
Manager WebアプリケーションのユーザーフレンドリーなHTMLインターフェースは、次の場所にあります。
http://{host}:{port}/manager/html
既に述べたように、アクセスするにはmanager-guiロールが必要です。このインターフェースに関するヘルプを提供する別のドキュメントがあります。を参照してください。
HTML インターフェースは、CSRF(クロスサイトリクエストフォージェリ)攻撃に対して保護されています。HTML ページへのアクセスごとにランダムなトークンが生成され、セッションに保存され、ページ上のすべてのリンクに含まれます。次のアクションでトークンの値が正しくない場合、アクションは拒否されます。トークンが期限切れになった場合は、マネージャのメインページまたはアプリケーション一覧ページからやり直してください。
サポートされているManagerコマンド
マネージャアプリケーションが処理できるすべてのコマンドは、次のような単一の要求URIで指定されます。
http://{host}:{port}/manager/text/{command}?{parameters}
ここで、{host}
と{port}
はTomcatが実行されているホスト名とポート番号を表し、{command}
は実行するマネージャコマンドを表し、{parameters}
はそのコマンドに固有のクエリパラメータを表します。以下の図では、インストールに合わせてホストとポートを適切にカスタマイズしてください。
コマンドは通常、HTTP GETリクエストによって実行されます。/deploy
コマンドには、HTTP PUTリクエストによって実行されるフォームがあります。
共通パラメータ
ほとんどのコマンドは、次のクエリパラメータの1つ以上を受け入れます。
- path - 対象のウェブアプリケーションのコンテキストパス(先頭のスラッシュを含む)。ROOTウェブアプリケーションを選択するには、「/」を指定します。
注記:マネージャアプリケーション自体に対して管理コマンドを実行することはできません。
注記:pathパラメータが明示的に指定されていない場合、pathとversionは、configパラメータから、またはconfigパラメータが存在しない場合はwarパラメータから、標準のコンテキスト命名ルールを使用して導出されます。 - version - 並列展開機能で使用されるこのウェブアプリケーションのバージョン。並列展開を使用する場合は、pathが必要な場所でpathに加えてversionを指定する必要があり、一意でなければならないのはpathだけではありません、pathとversionの組み合わせです。
注記:pathが明示的に指定されていない場合、versionパラメータは無視されます。 - war - ウェブアプリケーションアーカイブ(WAR)ファイルのURL、またはウェブアプリケーションを含むディレクトリのパス名、またはコンテキスト設定「.xml」ファイル。次のいずれかの形式のURLを使用できます。
- file:/absolute/path/to/a/directory - 展開済みのウェブアプリケーションを含むディレクトリの絶対パス。このディレクトリは、変更を加えることなく、指定したコンテキストパスにアタッチされます。
- file:/absolute/path/to/a/webapp.war - ウェブアプリケーションアーカイブ(WAR)ファイルの絶対パス。これは
/deploy
コマンドの場合にのみ有効であり、そのコマンドで許容される唯一の形式です。 - file:/absolute/path/to/a/context.xml - コンテキスト設定要素を含むウェブアプリケーションコンテキスト設定「.xml」ファイルの絶対パス。
- directory - ホストのアプリケーションベースディレクトリ内のウェブアプリケーションコンテキストのディレクトリ名。
- webapp.war - ホストのアプリケーションベースディレクトリにあるウェブアプリケーションwarファイルの名前。
各コマンドはtext/plain
形式(つまり、HTMLマークアップのないプレーンASCII)で応答を返します。これにより、人間とプログラムの両方で読みやすくなります。応答の最初の行はOK
またはFAIL
で始まり、要求されたコマンドが成功したかどうかを示します。失敗した場合、最初の行の残りの部分には発生した問題の説明が含まれます。以下のように、追加の情報を含むコマンドもあります。
国際化に関する注記 - マネージャアプリケーションはメッセージ文字列をリソースバンドルで検索するため、プラットフォームに合わせて文字列が翻訳されている可能性があります。以下の例は、メッセージの英語バージョンを示しています。
新しいアプリケーションアーカイブ(WAR)のリモート展開
http://localhost:8080/manager/text/deploy?path=/foo
このHTTP PUTリクエストで要求データとして指定されたウェブアプリケーションアーカイブ(WAR)ファイルのアップロードを行い、対応する仮想ホストのappBase
ディレクトリにインストールして起動し、指定されたパスからappBase
に追加されたWARファイルの名前を導出します。アプリケーションは後で/undeploy
コマンドを使用してアンデプロイ(および対応するWARファイルの削除)できます。
このコマンドはHTTP PUTリクエストによって実行されます。
/META-INF/context.xml
にコンテキスト設定XMLファイルを含めることで、.WARファイルにTomcat固有の展開設定を含めることができます。
URLパラメータには以下が含まれます。
update
:trueに設定すると、既存の更新は最初にアンデプロイされます。デフォルト値はfalseに設定されています。tag
:タグ名を指定すると、展開されたウェブアプリをタグまたはラベルに関連付けることができます。ウェブアプリケーションがアンデプロイされた場合、後で必要に応じてタグのみを使用して再デプロイできます。config
:コンテキスト設定「.xml」ファイルのURL。形式はfile:/absolute/path/to/a/context.xmlです。これは、コンテキスト設定要素を含むウェブアプリケーションコンテキスト設定「.xml」ファイルの絶対パスである必要があります。
注記 - このコマンドは/undeploy
コマンドの論理的な反対です。
インストールと起動が成功すると、次のような応答を受け取ります。
OK - Deployed application at context path /foo
それ以外の場合は、応答はFAIL
で始まり、エラーメッセージが含まれます。問題の考えられる原因には以下が含まれます。
- アプリケーションは既にパス/fooに存在します。
現在実行中のすべてのウェブアプリケーションのコンテキストパスは一意である必要があります。そのため、このコンテキストパスを使用して既存のウェブアプリケーションをアンデプロイするか、新しいアプリケーションに別のコンテキストパスを選択する必要があります。このエラーを回避するには、URLのパラメータとして
update
パラメータをtrue
の値で指定できます。その場合、展開を実行する前に既存のアプリケーションに対してアンデプロイが実行されます。 - 例外が発生しました。
新しいウェブアプリケーションの起動中に例外が発生しました。詳細についてはTomcatログを確認してください。考えられる原因としては、
/WEB-INF/web.xml
ファイルの解析の問題、またはアプリケーションイベントリスナーとフィルタの初期化時に発生したクラスの欠落などがあります。
ローカルパスからの新しいアプリケーションの展開
新しいウェブアプリケーションを展開して起動します。指定されたコンテキストpath
(他のウェブアプリケーションで使用されていないもの)にアタッチされます。このコマンドは/undeploy
コマンドの論理的な反対です。
このコマンドはHTTP GETリクエストによって実行されます。展開コマンドを使用できる方法はいくつかあります。
既に展開されているWebアプリケーションの展開
http://localhost:8080/manager/text/deploy?path=/footoo&tag=footag
これは、tag
属性を使用して展開された、以前に展開されたウェブアプリケーションを展開するために使用できます。マネージャウェブアプリの作業ディレクトリには、以前に展開されたWARが含まれていることに注意してください。削除すると、展開が失敗します。
URLによるディレクトリまたはWARの展開
Tomcatサーバーにあるウェブアプリケーションディレクトリまたは「.war」ファイルを展開します。path
を指定しない場合、pathとversionはディレクトリ名またはwarファイル名から導出されます。war
パラメータは、ディレクトリまたはウェブアプリケーションアーカイブ(WAR)ファイルのURL(file:
スキームを含む)を指定します。WARファイルを参照するURLのサポートされている構文については、java.net.JarURLConnection
クラスのJavadocページに記載されています。WARファイル全体を参照するURLのみを使用してください。
この例では、Tomcatサーバー上のディレクトリ/path/to/foo
にあるウェブアプリケーションが、/footoo
という名前のウェブアプリケーションコンテキストとして展開されます。
http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo
この例では、Tomcatサーバー上の「.war」ファイル/path/to/bar.war
が、/bar
という名前のウェブアプリケーションコンテキストとして展開されます。「path」パラメータがないため、コンテキストパスは「.war」拡張子を除いたウェブアプリケーションアーカイブファイル名にデフォルトで設定されます。
http://localhost:8080/manager/text/deploy?war=file:/path/to/bar.war
ホストappBaseからのディレクトリまたはWARの展開
ホストのappBaseディレクトリにあるウェブアプリケーションディレクトリまたは「.war」ファイルを展開します。pathとオプションのversionは、ディレクトリ名またはwarファイル名から導出されます。
この例では、TomcatサーバーのホストappBaseディレクトリにあるfoo
という名前のサブディレクトリにあるウェブアプリケーションが、/foo
という名前のウェブアプリケーションコンテキストとして展開されます。使用されるコンテキストパスは、ウェブアプリケーションディレクトリ名であることに注意してください。
http://localhost:8080/manager/text/deploy?war=foo
この例では、TomcatサーバーのホストappBaseディレクトリにある「.war」ファイルbar.war
が、/bar
という名前のウェブアプリケーションコンテキストとして展開されます。
http://localhost:8080/manager/text/deploy?war=bar.war
コンテキスト設定 ".xml" ファイルを使用した展開
HostのdeployXMLフラグがtrueに設定されている場合、コンテキスト設定「.xml」ファイルとオプションの「.war」ファイルまたはウェブアプリケーションディレクトリを使用してウェブアプリケーションを展開できます。コンテキスト設定「.xml」ファイルを使用してウェブアプリケーションを展開する場合は、コンテキストpath
は使用されません。
コンテキスト設定「.xml」ファイルには、Tomcatのserver.xml
設定ファイルで設定した場合と同様に、ウェブアプリケーションコンテキストの有効なXMLを含めることができます。例を以下に示します。
<Context path="/foobar" docBase="/path/to/application/foobar">
</Context>
オプションのwar
パラメータがウェブアプリケーション「.war」ファイルまたはディレクトリのURLに設定されている場合、コンテキスト設定「.xml」ファイルで設定されているdocBaseをオーバーライドします。
コンテキスト設定「.xml」ファイルを使用してアプリケーションを展開する例を以下に示します。
http://localhost:8080/manager/text/deploy?config=file:/path/context.xml
コンテキスト設定「.xml」ファイルと、サーバー上にあるウェブアプリケーション「.war」ファイルを使用してアプリケーションを展開する例を以下に示します。
http://localhost:8080/manager/text/deploy
?config=file:/path/context.xml&war=file:/path/bar.war
展開に関する注意
HostがunpackWARs=trueで構成されており、warファイルを展開する場合、warはHost appBaseディレクトリのディレクトリに展開されます。
アプリケーションのwarまたはディレクトリがHost appBaseディレクトリにインストールされており、HostがautoDeploy=trueで構成されているか、コンテキストパスが「.war」拡張子を除いたディレクトリ名またはwarファイル名と一致する必要があります。
信頼できないユーザーがウェブアプリケーションを管理できる場合のセキュリティのために、Host deployXMLフラグをfalseに設定できます。これにより、信頼できないユーザーが設定XMLファイルを使用してウェブアプリケーションを展開することができなくなり、Host appBaseの外部にあるアプリケーションディレクトリまたは「.war」ファイルを展開することもできなくなります。
展開応答
インストールと起動が成功すると、次のような応答を受け取ります。
OK - Deployed application at context path /foo
それ以外の場合は、応答はFAIL
で始まり、エラーメッセージが含まれます。問題の考えられる原因には以下が含まれます。
- アプリケーションは既にパス/fooに存在します。
現在実行中のすべてのウェブアプリケーションのコンテキストパスは一意である必要があります。そのため、このコンテキストパスを使用して既存のウェブアプリケーションをアンデプロイするか、新しいアプリケーションに別のコンテキストパスを選択する必要があります。このエラーを回避するには、URLのパラメータとして
update
パラメータをtrue
の値で指定できます。その場合、展開を実行する前に既存のアプリケーションに対してアンデプロイが実行されます。 - ドキュメントベースが存在しないか、読み取り可能なディレクトリではありません。
war
パラメータで指定されたURLは、このサーバー上の「展開済み」バージョンのウェブアプリケーションを含むディレクトリ、またはこのアプリケーションを含むウェブアプリケーションアーカイブ(WAR)ファイルの絶対URLを識別する必要があります。war
パラメータで指定された値を修正してください。 - 例外が発生しました。
新しいウェブアプリケーションの起動中に例外が発生しました。詳細についてはTomcatログを確認してください。考えられる原因としては、
/WEB-INF/web.xml
ファイルの解析の問題、またはアプリケーションイベントリスナーとフィルタの初期化時に発生したクラスの欠落などがあります。 - 無効なアプリケーションURLが指定されました。
指定したディレクトリまたはウェブアプリケーションのURLが無効でした。このようなURLは
file:
で始まる必要があり、WARファイルのURLは「.war」で終わる必要があります。 - 無効なコンテキストパスが指定されました。
コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。
- コンテキストパスはディレクトリ名またはWARファイル名と一致する必要があります。
アプリケーションのwarまたはディレクトリがHost appBaseディレクトリにインストールされており、HostがautoDeploy=trueで構成されている場合、コンテキストパスは「.war」拡張子を除いたディレクトリ名またはwarファイル名と一致する必要があります。
- ホストのウェブアプリケーションディレクトリにあるウェブアプリケーションのみをインストールできます。
Host deployXMLフラグがfalseに設定されている場合、Host appBaseディレクトリの外部にあるウェブアプリケーションディレクトリまたは「.war」ファイルを展開しようとすると、このエラーが発生します。
現在展開されているアプリケーションのリスト表示
http://localhost:8080/manager/text/list
現在展開されているすべてのウェブアプリケーションのコンテキストパス、現在の状態(running
またはstopped
)、アクティブなセッションの数を一覧表示します。Tomcatの起動直後の典型的な応答は次のようになります。
OK - Listed applications for virtual host localhost
/webdav:running:0:webdav
/examples:running:0:examples
/manager:running:0:manager
/:running:0:ROOT
/test:running:0:test##2
/test:running:0:test##1
既存アプリケーションのリロード
http://localhost:8080/manager/text/reload?path=/examples
既存のアプリケーションにシャットダウンして再ロードするようシグナルを送信します。これは、ウェブアプリケーションコンテキストが再ロード可能ではなく、/WEB-INF/classes
ディレクトリにクラスまたはプロパティファイルを更新した場合、または/WEB-INF/lib
ディレクトリにjarファイルを追加または更新した場合に役立ちます。
このコマンドが成功すると、次のような応答が表示されます。
OK - Reloaded application at context path /examples
それ以外の場合は、応答はFAIL
で始まり、エラーメッセージが含まれます。問題の考えられる原因には以下が含まれます。
- 例外が発生しました。
ウェブアプリケーションの再起動中に例外が発生しました。詳細についてはTomcatログを確認してください。
- 無効なコンテキストパスが指定されました。
コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。
- パス/fooにコンテキストが存在しません。
指定されたコンテキストパスにデプロイされたアプリケーションはありません。
- コンテキストパスが指定されていません。
path
パラメータが必要です。 - /foo パスにWAR形式でデプロイされたアプリケーションではリロードがサポートされていません。
現在、WARファイルから直接Webアプリケーションをデプロイした場合、アプリケーションのリロード(クラスまたは
web.xml
ファイルの変更を反映)はサポートされていません。Webアプリケーションは展開されたディレクトリからデプロイされた場合のみ機能します。WARファイルを使用している場合は、変更を反映するために、アプリケーションをundeploy
してからdeploy
するか、update
パラメータを指定してdeploy
し直してください。
OSとJVMプロパティのリスト表示
http://localhost:8080/manager/text/serverinfo
Tomcatのバージョン、OS、およびJVMプロパティに関する情報を一覧表示します。
エラーが発生した場合は、レスポンスはFAIL
で始まり、エラーメッセージが含まれます。問題の原因としては、以下が考えられます。
- 例外が発生しました。
システムプロパティを列挙しようとした際に例外が発生しました。詳細については、Tomcatログを確認してください。
使用可能なグローバルJNDIリソースのリスト表示
http://localhost:8080/manager/text/resources[?type=xxxxx]
コンテキスト設定ファイルのリソースリンクで使用できるグローバルJNDIリソースを一覧表示します。type
リクエストパラメータを指定する場合は、対象となるリソースタイプの完全修飾Javaクラス名を指定する必要があります(例:すべての使用可能なJDBCデータソースの名前を取得するには、javax.sql.DataSource
を指定します)。type
リクエストパラメータを指定しない場合は、すべてのタイプの資源が返されます。
type
リクエストパラメータが指定されているかどうかに応じて、正常なレスポンスの最初の行は次のようになります。
OK - Listed global resources of all types
または
OK - Listed global resources of type xxxxx
その後、リソースごとに1行続きます。各行は、コロン文字(":")で区切られたフィールドで構成されます。以下のとおりです。
- グローバルリソース名 - これは、
<ResourceLink>
要素のglobal
属性で使用される、このグローバルJNDIリソースの名前です。 - グローバルリソースタイプ - このグローバルJNDIリソースの完全修飾Javaクラス名です。
エラーが発生した場合は、レスポンスはFAIL
で始まり、エラーメッセージが含まれます。問題の原因としては、以下が考えられます。
- 例外が発生しました。
グローバルJNDIリソースを列挙しようとした際に例外が発生しました。詳細については、Tomcatログを確認してください。
- 使用可能なグローバルJNDIリソースはありません。
実行中のTomcatサーバーは、グローバルJNDIリソースなしで設定されています。
セッション統計
http://localhost:8080/manager/text/sessions?path=/examples
Webアプリケーションのデフォルトのセッションタイムアウトと、実際のタイムアウト時間から1分単位の範囲に分類される現在アクティブなセッションの数を表示します。たとえば、Tomcatを再起動してから/examples
WebアプリのJSPサンプルの1つを実行すると、次のような結果が得られる場合があります。
OK - Session information for application at context path /examples
Default maximum session inactive interval 30 minutes
<1 minutes: 1 sessions
1 - <2 minutes: 1 sessions
セッションの期限切れ
http://localhost:8080/manager/text/expire?path=/examples&idle=num
セッション統計(上記の/sessions
コマンドと同様)を表示し、num
分以上アイドル状態のセッションを期限切れにします。すべてのセッションを期限切れにするには、&idle=0
を使用します。
OK - Session information for application at context path /examples
Default maximum session inactive interval 30 minutes
1 - <2 minutes: 1 sessions
3 - <4 minutes: 1 sessions
>0 minutes: 2 sessions were expired
実際、/sessions
と/expire
は同じコマンドの同義語です。違いはidle
パラメータの存在にあります。
既存アプリケーションの開始
http://localhost:8080/manager/text/start?path=/examples
停止したアプリケーションに再起動を指示し、再び使用可能にします。停止と起動は、たとえば、アプリケーションに必要なデータベースが一時的に使用できなくなった場合に役立ちます。ユーザーがデータベース例外を連続して発生させるよりも、このデータベースに依存するWebアプリケーションを停止する方が通常は適切です。
このコマンドが成功すると、次のような応答が表示されます。
OK - Started application at context path /examples
それ以外の場合は、応答はFAIL
で始まり、エラーメッセージが含まれます。問題の考えられる原因には以下が含まれます。
- 例外が発生しました。
Webアプリケーションの起動中に例外が発生しました。詳細については、Tomcatログを確認してください。
- 無効なコンテキストパスが指定されました。
コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。
- パス/fooにコンテキストが存在しません。
指定されたコンテキストパスにデプロイされたアプリケーションはありません。
- コンテキストパスが指定されていません。
path
パラメータが必要です。
既存アプリケーションの停止
http://localhost:8080/manager/text/stop?path=/examples
既存のアプリケーションに使用不可を指示しますが、デプロイされたままにします。アプリケーションが停止している間に受信されたリクエストはすべてHTTPエラー404が表示され、このアプリケーションはアプリケーション一覧コマンドに「停止済み」として表示されます。
このコマンドが成功すると、次のような応答が表示されます。
OK - Stopped application at context path /examples
それ以外の場合は、応答はFAIL
で始まり、エラーメッセージが含まれます。問題の考えられる原因には以下が含まれます。
- 例外が発生しました。
Webアプリケーションの停止中に例外が発生しました。詳細については、Tomcatログを確認してください。
- 無効なコンテキストパスが指定されました。
コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。
- パス/fooにコンテキストが存在しません。
指定されたコンテキストパスにデプロイされたアプリケーションはありません。
- コンテキストパスが指定されていません
path
パラメータが必要です。
既存アプリケーションのアンデプロイ
http://localhost:8080/manager/text/undeploy?path=/examples
警告 - このコマンドは、この仮想ホストのappBase
ディレクトリ(通常は「webapps」)内にあるWebアプリケーションアーティファクトをすべて削除します。これにより、存在する場合はアプリケーションの.WARファイル、展開形式でのデプロイまたは.WAR展開からのアプリケーションディレクトリ、および$CATALINA_BASE/conf/[enginename]/[hostname]/
ディレクトリからのXMLコンテキスト定義が削除されます。アプリケーションを単に使用不可にしたい場合は、代わりに/stop
コマンドを使用してください。
既存のアプリケーションに正常なシャットダウンを指示し、Tomcatから削除します(これにより、このコンテキストパスを後で再利用できるようになります)。さらに、この仮想ホストのappBase
ディレクトリ(通常は「webapps」)に存在する場合は、ドキュメントルートディレクトリも削除されます。このコマンドは/deploy
コマンドの論理的な反対です。
このコマンドが成功すると、次のような応答が表示されます。
OK - Undeployed application at context path /examples
それ以外の場合は、応答はFAIL
で始まり、エラーメッセージが含まれます。問題の考えられる原因には以下が含まれます。
- 例外が発生しました。
Webアプリケーションのアンデプロイ中に例外が発生しました。詳細については、Tomcatログを確認してください。
- 無効なコンテキストパスが指定されました。
コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。
- /fooという名前のコンテキストが存在しません。
指定された名前のデプロイ済みアプリケーションはありません。
- コンテキストパスが指定されていません
path
パラメータが必要です。
メモリリークの検出
http://localhost:8080/manager/text/findleaks[?statusLine=[true|false]]
find leaks診断は、完全なガベージコレクションをトリガーします。本番システムでは、非常に注意して使用する必要があります。
find leaks診断は、停止、リロード、またはアンデプロイされたときにメモリリークを引き起こしたWebアプリケーションを特定しようとします。結果は常にプロファイラで確認する必要があります。この診断では、StandardHost実装によって提供される追加機能を使用します。StandardHostを拡張しないカスタムホストを使用している場合は機能しません。
Javaコードから明示的に完全なガベージコレクションをトリガーすることは、信頼性が低いことが文書化されています。さらに、使用するJVMによっては、-XX:+DisableExplicitGC
のように、明示的なGCトリガーを無効にするオプションがあります。診断が正常に完全なGCを実行したことを確認するには、GCログ、JConsoleなどのツールを使用して確認する必要があります。
このコマンドが成功すると、次のような応答が表示されます。
/leaking-webapp
レスポンスにステータス行を含める場合は、値をtrue
としてリクエストにstatusLine
クエリパラメータを含めてください。
停止、リロード、またはアンデプロイされたWebアプリケーションのコンテキストパスで、以前の実行からのクラスがメモリにまだロードされているためメモリリークが発生しているものが、新しい行に一覧表示されます。アプリケーションが複数回リロードされている場合は、複数回一覧表示される場合があります。
コマンドが成功しなかった場合は、レスポンスはFAIL
で始まり、エラーメッセージが含まれます。
コネクタSSL/TLS暗号情報
http://localhost:8080/manager/text/sslConnectorCiphers
SSL Connector/Ciphers診断は、現在各コネクタに対して設定されているSSL/TLS暗号を一覧表示します。
レスポンスは次のようになります。
OK - Connector / SSL Cipher information
Connector[HTTP/1.1-8080]
SSL is not enabled for this connector
Connector[HTTP/1.1-8443]
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
...
コネクタSSL/TLS証明書チェーン情報
http://localhost:8080/manager/text/sslConnectorCerts
SSL Connector/Certs診断は、現在各仮想ホストに対して設定されている証明書チェーンを一覧表示します。
レスポンスは次のようになります。
OK - Connector / Certificate Chain information
Connector[HTTP/1.1-8080]
SSL is not enabled for this connector
Connector[HTTP/1.1-8443]-_default_-RSA
[
[
Version: V3
Subject: CN=localhost, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
...
コネクタSSL/TLS信頼済み証明書情報
http://localhost:8080/manager/text/sslConnectorTrustedCerts
SSL Connector/Certs診断は、現在各仮想ホストに対して設定されている信頼された証明書を一覧表示します。
レスポンスは次のようになります。
OK - Connector / Trusted Certificate information
Connector[HTTP/1.1-8080]
SSL is not enabled for this connector
Connector[HTTP/1.1-8443]-_default_
[
[
Version: V3
Subject: CN=Apache Tomcat Test CA, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US
...
TLS設定のリロード
http://localhost:8080/manager/text/sslReload?tlsHostName=name
TLS設定ファイル(証明書ファイルとキーファイル)をリロードします(これにより、server.xmlの再解析はトリガーされません)。すべてのホストのファイルをリロードするには、tlsHostName
パラメータを指定しないでください。
OK - Reloaded TLS configuration for [_default_]
スレッドダンプ
http://localhost:8080/manager/text/threaddump
JVMスレッドダンプを書き込みます。
レスポンスは次のようになります。
OK - JVM thread dump
2014-12-08 07:24:40.080
Full thread dump Java HotSpot(TM) Client VM (25.25-b02 mixed mode):
"http-nio-8080-exec-2" Id=26 cpu=46800300 ns usr=46800300 ns blocked 0 for -1 ms waited 0 for -1 ms
java.lang.Thread.State: RUNNABLE
locks java.util.concurrent.ThreadPoolExecutor$Worker@1738ad4
at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446)
at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:440)
at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:409)
at org.apache.catalina.manager.ManagerServlet.threadDump(ManagerServlet.java:557)
at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:371)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:618)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:725)
...
VM情報
http://localhost:8080/manager/text/vminfo
Java仮想マシンに関する診断情報を書き込みます。
レスポンスは次のようになります。
OK - VM info
2014-12-08 07:27:32.578
Runtime information:
vmName: Java HotSpot(TM) Client VM
vmVersion: 25.25-b02
vmVendor: Oracle Corporation
specName: Java Virtual Machine Specification
specVersion: 1.8
specVendor: Oracle Corporation
managementSpecVersion: 1.2
name: ...
startTime: 1418012458849
uptime: 393855
isBootClassPathSupported: true
OS information:
...
設定の保存
http://localhost:8080/manager/text/save
パラメータを指定せずに指定すると、このコマンドはサーバーの現在の設定をserver.xmlに保存します。必要に応じて、既存のファイルはバックアップとして名前が変更されます。
デプロイされたWebアプリケーションのパスと一致するpath
パラメータを指定すると、そのWebアプリケーションの設定が、現在のホストのxmlBase
内の適切な名前のcontext.xmlファイルに保存されます。
このコマンドを使用するには、StoreConfig MBeanが存在する必要があります。通常、これはStoreConfigLifecycleListenerを使用して設定されます。
コマンドが成功しなかった場合は、レスポンスはFAIL
で始まり、エラーメッセージが含まれます。
サーバー状態
次のリンクから、サーバーに関するステータス情報を確認できます。いずれかのmanager-xxxロールでこのページにアクセスできます。
http://localhost:8080/manager/status
http://localhost:8080/manager/status/all
サーバーのステータス情報をHTML形式で表示します。
http://localhost:8080/manager/status?XML=true
http://localhost:8080/manager/status/all?XML=true
サーバーのステータス情報をXML形式で表示します。
http://localhost:8080/manager/status?JSON=true
http://localhost:8080/manager/status/all?JSON=true
サーバーのステータス情報をJSON形式で表示します。
まず、サーバーとJVMのバージョン番号、JVMプロバイダー、OS名と番号、アーキテクチャタイプが表示されます。
次に、JVMのメモリ使用量に関する情報が表示されます。
次に、Tomcat AJPおよびHTTPコネクタに関する情報が表示されます。両方の情報が利用可能です。
スレッド情報:最大スレッド数、最小および最大スペアスレッド数、現在のスレッド数、現在のビジー状態のスレッド数。
リクエスト情報:最大処理時間と処理時間、リクエスト数とエラー数、受信および送信バイト数。
ステージ、時間、送信バイト数、受信バイト数、クライアント、仮想ホスト、リクエストを示すテーブル。既存のスレッドがすべてテーブルに一覧表示されます。スレッドの可能なステージの一覧を次に示します。
「リクエストの解析と準備」:リクエストヘッダーが解析されているか、リクエストボディを読み取るための必要な準備(転送エンコーディングが指定されている場合)が行われています。
「サービス」:スレッドがリクエストを処理し、レスポンスを生成しています。「リクエストの解析と準備」ステージに続き、「完了」ステージの前にあります。このステージには常に少なくとも1つのスレッドがあります(サーバーステータスページ)。
「完了」:リクエスト処理の終了。出力バッファに残っているレスポンスはクライアントに送信されます。このステージの後に、接続を維持する必要がある場合は「キープアライブ」、そうでない場合は「準備完了」が続きます。
「キープアライブ」:クライアントが別のリクエストを送信した場合に備えて、スレッドはクライアントとの接続を開いたままにします。別のリクエストを受信すると、次のステージは「リクエストの解析と準備」になります。キープアライブがタイムアウトする前にリクエストを受信しなかった場合、接続は閉じられ、次のステージは「準備完了」になります。
「準備完了」:スレッドは休止中で、使用準備ができています。
/status/all
コマンドを使用している場合、デプロイされている各Webアプリケーションに関する追加情報が利用可能になります。
JMXプロキシサーブレットの使用
JMXプロキシサーブレットとは
JMXクエリコマンド
形式は次のとおりです。
http://webserver/manager/jmxproxy/?qry=STUFF
ここで、STUFF
は実行するJMXクエリです。たとえば、実行したいクエリをいくつか示します。
-
qry=*%3Atype%3DRequestProcessor%2C* --> type=RequestProcessor
リクエストを処理できるすべてのワーカーを探し、その状態を報告します。 -
qry=*%3Aj2eeType%3DServlet%2c* --> j2eeType=Servlet
ロードされているすべてのサーブレットを返します。 -
qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue --> Catalina:type=Environment,resourcetype=Global,name=simpleValue
指定された名前で特定のMBeanを検索します。
その機能を本当に理解するには、実験する必要があります。qry
パラメータを指定しない場合、すべてのMBeanが表示されます。Tomcatのソースコードを確認し、JMX仕様を理解して、実行できるすべてのクエリをよりよく理解することをお勧めします。
JMXゲットコマンド
JMXProxyServlet は、特定の MBean の属性の値を取得するために使用できる "get" コマンドもサポートしています。get
コマンドの一般的な形式は次のとおりです。
http://webserver/manager/jmxproxy/?get=BEANNAME&att=MYATTRIBUTE&key=MYKEY
次のパラメータを指定する必要があります。
get
: 完全な Bean 名att
: 取得する属性key
: (オプション)CompositeData MBean 属性へのキー
すべてが正常に実行された場合は「OK」と表示され、そうでない場合はエラーメッセージが表示されます。たとえば、現在のヒープメモリデータを取得したいとします。
http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage
または、「used」キーのみを取得する場合
http://webserver/manager/jmxproxy/
?get=java.lang:type=Memory&att=HeapMemoryUsage&key=used
JMXセットコマンド
MBean をクエリできるようになったので、Tomcat の内部を操作してみましょう!set コマンドの一般的な形式は次のとおりです。
http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE
そのため、3 つのリクエストパラメータを指定する必要があります。
set
: 完全な Bean 名att
: 変更する属性val
: 新しい値
すべてが正常に実行された場合は「OK」と表示され、そうでない場合はエラーメッセージが表示されます。たとえば、ErrorReportValve
のデバッグをオンザフライで有効にしたいとします。次のコマンドはデバッグを 10 に設定します。
http://localhost:8080/manager/jmxproxy/
?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
&att=debug&val=10
そして、私の結果は次のとおりです(結果は異なる場合があります)。
Result: ok
不正な値を渡した場合の結果を示します。私が使用した URL は次のとおりです。デバッグを 'cow' に設定しようとしました。
http://localhost:8080/manager/jmxproxy/
?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
&att=debug&val=cow
それを試みると、結果は次のようになります。
Error: java.lang.NumberFormatException: For input string: "cow"
JMXインボークコマンド
invoke
コマンドを使用すると、MBean でメソッドを呼び出すことができます。コマンドの一般的な形式は次のとおりです。
http://webserver/manager/jmxproxy/
?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS
たとえば、**Service** の findConnectors()
メソッドを呼び出すには、次のようにします。
http://localhost:8080/manager/jmxproxy/
?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=
Antを使用したManagerコマンドの実行
上記で説明されているように HTTP リクエストを介して Manager コマンドを実行する機能に加えて、Tomcat には *Ant*(バージョン 1.4 以降)ビルドツール用の便利な一連のタスク定義が含まれています。これらのコマンドを使用するには、次の設定操作を実行する必要があります。
- https://ant.dokyumento.jp から Ant のバイナリ配布版をダウンロードします。バージョン **1.4** 以降を使用する必要があります。
- Ant 配布版を便利なディレクトリ(以降の説明では ANT_HOME と呼びます)にインストールします。
$ANT_HOME/bin
ディレクトリをPATH
環境変数に追加します。manager-script
ロールを含む少なくとも 1 つのユーザー名/パスワードの組み合わせを Tomcat ユーザーデータベースに設定します。
Ant でカスタムタスクを使用するには、最初に <import>
要素を使用して宣言する必要があります。そのため、build.xml
ファイルは次のようになります。
<project name="My Application" default="compile" basedir=".">
<!-- Configure the directory into which the web application is built -->
<property name="build" value="${basedir}/build"/>
<!-- Configure the context path for this application -->
<property name="path" value="/myapp"/>
<!-- Configure properties to access the Manager application -->
<property name="url" value="http://localhost:8080/manager/text"/>
<property name="username" value="myusername"/>
<property name="password" value="mypassword"/>
<!-- Configure the path to the Tomcat installation -->
<property name="catalina.home" value="/usr/local/apache-tomcat"/>
<!-- Configure the custom Ant tasks for the Manager application -->
<import file="${catalina.home}/bin/catalina-tasks.xml"/>
<!-- Executable Targets -->
<target name="compile" description="Compile web application">
<!-- ... construct web application in ${build} subdirectory, and
generated a ${path}.war ... -->
</target>
<target name="deploy" description="Install web application"
depends="compile">
<deploy url="${url}" username="${username}" password="${password}"
path="${path}" war="file:${build}${path}.war"/>
</target>
<target name="reload" description="Reload web application"
depends="compile">
<reload url="${url}" username="${username}" password="${password}"
path="${path}"/>
</target>
<target name="undeploy" description="Remove web application">
<undeploy url="${url}" username="${username}" password="${password}"
path="${path}"/>
</target>
</project>
注:上記の import による resources タスクの定義は、Ant 1.7 に追加された resources データ型をオーバーライドします。resources データ型を使用する場合は、Ant の名前空間サポートを使用して catalina-tasks.xml
を変更し、Tomcat タスクを独自のネームスペースに割り当てる必要があります。
これで、ant deploy
などのコマンドを実行してアプリケーションを実行中の Tomcat インスタンスにデプロイしたり、ant reload
を実行して Tomcat にアプリケーションをリロードするように指示したりできます。また、この build.xml
ファイルの興味深い値のほとんどは置換可能なプロパティとして定義されているため、コマンドラインからそれらの値をオーバーライドできます。たとえば、実際の manager パスワードを build.xml
ファイルのソースコードに含めることはセキュリティリスクと見なされる可能性があります。これを回避するには、パスワードプロパティを省略し、コマンドラインから指定します。
ant -Dpassword=secret deploy
タスク出力のキャプチャ
*Ant* バージョン **1.6.2** 以降では、Catalina タスクは、その出力をプロパティまたは外部ファイルにキャプチャするオプションを提供します。次の <redirector>
タイプ属性のサブセットを直接サポートします。
属性 | 説明 | 必須 |
---|---|---|
output | 出力を書き込むファイルの名前。エラーストリームもファイルまたはプロパティにリダイレクトされない場合、この出力に表示されます。 | いいえ |
error | コマンドの標準エラーをリダイレクトするファイル。 | いいえ |
logError | この属性は、Ant のログにエラー出力を表示し、出力をファイル/プロパティにリダイレクトする場合に使用します。エラー出力は、出力ファイル/プロパティに含まれません。error または errorProperty 属性でエラーをリダイレクトする場合は、これは効果がありません。 | いいえ |
append | 出力ファイルとエラーファイルを追記するか上書きするか。デフォルトは false です。 |
いいえ |
createemptyfiles | 出力ファイルとエラーファイルを空であっても作成するかどうか。デフォルトは true です。 |
いいえ |
outputproperty | コマンドの出力を格納するプロパティの名前。エラーストリームが別のファイルまたはストリームにリダイレクトされない限り、このプロパティにはエラー出力が含まれます。 | いいえ |
errorproperty | コマンドの標準エラーを格納するプロパティの名前。 | いいえ |
追加でいくつかの属性を指定することもできます。
属性 | 説明 | 必須 |
---|---|---|
alwaysLog | この属性は、キャプチャしている出力を Ant のログにも表示する場合に使用します。タスクの出力をキャプチャする場合以外は使用しないでください。デフォルトは false です。この属性は Ant 1.6.3 の <redirector> で直接サポートされます。 |
いいえ |
failonerror | この属性は、manager コマンド処理のエラーによって Ant の実行が終了するのを回避する場合に使用します。デフォルトは true です。エラー出力をキャプチャする場合は false に設定する必要があります。そうでない場合、キャプチャされる前に実行が終了します。この属性は manager コマンドの実行のみに作用します。コマンド属性が間違っているか不足している場合でも、Ant の実行は終了します。 |
いいえ |
それらは、そのすべての属性を指定できる埋め込み <redirector>
要素もサポートしますが、input
、inputstring
、inputencoding
は、受け入れられていても使用されません。これは、このコンテキストでは意味がないためです。<redirector>
要素属性の詳細については、Ant マニュアル を参照してください。
この出力リダイレクションサポートの使用方法を示す build ファイルの抜粋を次に示します。
<target name="manager.deploy"
depends="context.status"
if="context.notInstalled">
<deploy url="${mgr.url}"
username="${mgr.username}"
password="${mgr.password}"
path="${mgr.context.path}"
config="${mgr.context.descriptor}"/>
</target>
<target name="manager.deploy.war"
depends="context.status"
if="context.deployable">
<deploy url="${mgr.url}"
username="${mgr.username}"
password="${mgr.password}"
update="${mgr.update}"
path="${mgr.context.path}"
war="${mgr.war.file}"/>
</target>
<target name="context.status">
<property name="running" value="${mgr.context.path}:running"/>
<property name="stopped" value="${mgr.context.path}:stopped"/>
<list url="${mgr.url}"
outputproperty="ctx.status"
username="${mgr.username}"
password="${mgr.password}">
</list>
<condition property="context.running">
<contains string="${ctx.status}" substring="${running}"/>
</condition>
<condition property="context.stopped">
<contains string="${ctx.status}" substring="${stopped}"/>
</condition>
<condition property="context.notInstalled">
<and>
<isfalse value="${context.running}"/>
<isfalse value="${context.stopped}"/>
</and>
</condition>
<condition property="context.deployable">
<or>
<istrue value="${context.notInstalled}"/>
<and>
<istrue value="${context.running}"/>
<istrue value="${mgr.update}"/>
</and>
<and>
<istrue value="${context.stopped}"/>
<istrue value="${mgr.update}"/>
</and>
</or>
</condition>
<condition property="context.undeployable">
<or>
<istrue value="${context.running}"/>
<istrue value="${context.stopped}"/>
</or>
</condition>
</target>
警告:あまり意味がなく、常に悪いアイデアですが、Catalina タスクを複数回呼び出すと、Ant タスクの依存関係チェーンの設定が不適切なため、意図していなくても同じ Ant 実行でタスクが複数回呼び出される可能性があります。タスクからの出力をキャプチャする場合は、注意が必要です。予期しない結果につながる可能性があります。
- プロパティにキャプチャする場合、Ant プロパティは不変であり、一度設定されると変更できないため、最初の呼び出しからの出力のみが含まれます。
- ファイルにキャプチャする場合、
append="true"
属性を使用していない限り、各実行で上書きされ、最後の呼び出しからの出力のみが含まれます。その場合は、各タスク呼び出しの出力がファイルに追加されます。