Managerアプリの使い方

目次

はじめに

多くの本番環境において、コンテナ全体をシャットダウンして再起動することなく、新しいウェブアプリケーションをデプロイしたり、既存のウェブアプリケーションをアンデプロイしたりする機能は非常に有用です。さらに、Tomcatサーバーの設定ファイルでreloadableと宣言していなくても、既存のアプリケーションに自身をリロードするよう要求することができます。

これらの機能をサポートするため、Tomcatには以下の機能をサポートするウェブアプリケーション(デフォルトではコンテキストパス/managerにインストールされています)が含まれています。

  • アップロードされたWARファイルの内容から新しいウェブアプリケーションをデプロイします。
  • 指定されたコンテキストパスに、サーバーファイルシステムから新しいウェブアプリケーションをデプロイします。
  • 現在デプロイされているウェブアプリケーションと、それらのウェブアプリで現在アクティブなセッションを一覧表示します。
  • 既存のウェブアプリケーションをリロードし、/WEB-INF/classesまたは/WEB-INF/libの内容の変更を反映させます。
  • OSおよびJVMプロパティの値を一覧表示します。
  • 利用可能なグローバルJNDIリソースを一覧表示します。これらは、<Context>デプロイメント記述内にネストされた<ResourceLink>要素を準備するデプロイメントツールで使用されます。
  • 停止中のアプリケーションを開始します(これにより、再び利用可能になります)。
  • 既存のアプリケーションを停止します(これにより利用不可になります)が、アンデプロイはしません。
  • デプロイされたウェブアプリケーションをアンデプロイし、そのドキュメントベースディレクトリを削除します(ファイルシステムからデプロイされた場合を除く)。

デフォルトのTomcatインストールには、デフォルトの仮想ホスト用に設定されたManagerアプリケーションのインスタンスが含まれています。追加の仮想ホストを作成する場合、それらのホストの1つ以上にManagerアプリケーションのインスタンスを追加したいと思うかもしれません。新しいホストにManagerウェブアプリケーションのContextインスタンスを追加するには、$CATALINA_BASE/conf/[enginename]/[hostname]フォルダにmanager.xmlコンテキスト設定ファイルをインストールします。以下に例を示します

<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ウェブアプリケーションを使用するには、3つの方法があります。

  • ブラウザで使用するユーザーインターフェースを備えたアプリケーションとして。localhostをウェブサイトのホスト名に置き換えることができるURLの例は次のとおりです: https://:8080/manager/html
  • HTTPリクエストのみを使用する最小限のバージョンで、システム管理者によってセットアップされたスクリプトでの使用に適しています。コマンドはリクエストURIの一部として与えられ、応答は簡単に解析および処理できる単純なテキスト形式です。詳細については、「サポートされているManagerコマンド」を参照してください。
  • Ant(バージョン1.4以降)ビルドツール用の便利なタスク定義セット。詳細については、「Antを使用したManagerコマンドの実行」を参照してください。

Managerアプリケーションアクセスの設定

以下の説明では、ほとんどの相対パスが解決されるベースディレクトリを指す変数名$CATALINA_BASEを使用します。CATALINA_BASEディレクトリを設定してTomcatを複数インスタンスで構成していない場合、$CATALINA_BASEはTomcatをインストールしたディレクトリである$CATALINA_HOMEの値に設定されます。

Tomcatを、インターネット上の誰でもサーバー上でManagerアプリケーションを実行できるデフォルト設定で出荷することは非常に危険です。そのため、Managerアプリケーションは、使用を試みる者は、manager-xxxロールのいずれかが関連付けられたユーザー名とパスワードを使用して認証する必要があるという要件付きで提供されます(ロール名は、必要な機能によって異なります)。さらに、デフォルトのユーザーファイル($CATALINA_BASE/conf/tomcat-users.xml)には、これらのロールに割り当てられたユーザー名はありません。したがって、Managerアプリケーションへのアクセスはデフォルトで完全に無効になっています。

ロール名は、Managerウェブアプリケーションのweb.xmlファイルで見つけることができます。利用可能なロールは次のとおりです。

  • manager-gui — HTMLインターフェースへのアクセス。
  • manager-status — 「サーバーのステータス」ページへのアクセスのみ。
  • manager-script — このドキュメントで説明されているツールフレンドリーなプレーンテキストインターフェースと、「サーバーのステータス」ページへのアクセス。
  • manager-jmx — JMXプロキシインターフェースと、「サーバーのステータス」ページへのアクセス。

HTMLインターフェースはCSRF(クロスサイトリクエストフォージェリ)攻撃から保護されていますが、テキストおよびJMXインターフェースは保護できません。これは、テキストおよびJMXインターフェースへのアクセスを許可されたユーザーは、ウェブブラウザでManagerアプリケーションにアクセスする際に注意が必要であることを意味します。CSRF保護を維持するには

  • ウェブブラウザを使用して、manager-scriptまたはmanager-jmxロールを持つユーザー(例えば、プレーンテキストまたはJMXインターフェースのテストのため)でManagerアプリケーションにアクセスした場合、セッションを終了するためにその後ブラウザのすべてのウィンドウを閉じなければなりません。ブラウザを閉じずに他のサイトにアクセスすると、CSRF攻撃の被害に遭う可能性があります。
  • manager-guiロールを持つユーザーに、manager-scriptまたはmanager-jmxロールを付与しないことをお勧めします。

:JMXプロキシインターフェースは、実質的にTomcatの低レベルのルートのような管理インターフェースです。呼び出すコマンドを知っていれば、多くのことができます。manager-jmxロールを有効にする際には注意が必要です。

Managerウェブアプリケーションへのアクセスを有効にするには、新しいユーザー名/パスワードの組み合わせを作成し、それにmanager-xxxロールのいずれかを関連付けるか、既存のユーザー名/パスワードの組み合わせにmanager-xxxロールを追加する必要があります。このドキュメントの大部分ではテキストインターフェースの使用について説明しているため、この例ではmanager-scriptというロール名を使用します。ユーザー名/パスワードの構成方法は、使用しているレルム実装によって異なります。

  • UserDatabaseRealmMemoryUserDatabase、または MemoryRealmUserDatabaseRealmMemoryUserDatabase は、デフォルトの$CATALINA_BASE/conf/server.xmlで設定されます。MemoryUserDatabaseMemoryRealm の両方は、デフォルトで$CATALINA_BASE/conf/tomcat-users.xmlに保存されているXML形式のファイルを読み取ります。このファイルは、任意のテキストエディタで編集できます。このファイルには、各ユーザーのXML <user>が含まれており、次のようなものになります。
    <user username="craigmcc" password="secret" roles="standard,manager-script" />
    これは、この個人がログオンするために使用するユーザー名とパスワード、および関連付けられているロール名を定義します。既存の1つ以上のユーザーのカンマ区切りのroles属性にmanager-scriptロールを追加したり、その割り当てられたロールを持つ新しいユーザーを作成したりできます。
  • DataSourceRealm — ユーザーおよびロール情報は、JDBCを介してアクセスされるデータベースに保存されます。お使いの環境の標準手順に従って、既存の1人以上のユーザーにmanager-scriptロールを追加したり、このロールが割り当てられた新しいユーザーを1人以上作成したりします。
  • JNDIRealm — ユーザーおよびロール情報は、LDAPを介してアクセスされるディレクトリサーバーに保存されます。お使いの環境の標準手順に従って、既存の1人以上のユーザーにmanager-scriptロールを追加したり、このロールが割り当てられた新しいユーザーを1人以上作成したりします。

次のセクションで説明するManagerコマンドのいずれかを初めて発行しようとすると、BASIC認証を使用してログオンするように求められます。入力するユーザー名とパスワードは、ユーザーデータベース内でmanager-scriptロールを持つ有効なユーザーを識別できる限り、問題ありません。

パスワード制限に加えて、Managerウェブアプリケーションへのアクセスは、RemoteAddrValveまたはRemoteHostValveを追加することで、リモートIPアドレスまたはホストによって制限できます。詳細については、バルブドキュメントを参照してください。以下に、IPアドレスによってlocalhostへのアクセスを制限する例を示します。

<Context privileged="true">
         <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                allow="127\.0\.0\.1"/>
</Context>

HTMLユーザーフレンドリーインターフェース

ManagerウェブアプリケーションのユーザーフレンドリーなHTMLインターフェースは以下の場所にあります。

http://{host}:{port}/manager/html

すでに上記で述べたように、これにアクセスするにはmanager-guiロールが必要です。このインターフェースに関するヘルプを提供する別のドキュメントがあります。参照:

HTMLインターフェースはCSRF(クロスサイトリクエストフォージェリ)攻撃から保護されています。HTMLページへの各アクセスはランダムなトークンを生成し、それはセッションに保存され、ページ上のすべてのリンクに含まれます。次のアクションに正しいトークン値がない場合、そのアクションは拒否されます。トークンの有効期限が切れている場合は、Managerのメインページまたはアプリケーション一覧ページからやり直すことができます。

ManagerウェブアプリケーションのHTMLインターフェースのサブタイトルをカスタマイズするには、任意の有効なXMLエスケープされたHTMLコードをHTMLManagerServlethtmlSubTitle初期化パラメーターに追加できます。

<servlet>
  <servlet-name>HTMLManager</servlet-name>
  <servlet-class>org.apache.catalina.manager.HTMLManagerServlet</servlet-class>
  <init-param>
    <param-name>htmlSubTitle</param-name>
    <param-value>Company Inc.&lt;br&gt;&lt;i style=&apos;color:red&apos;&gt;Staging&lt;/i&gt;</param-value>
  </init-param>
  ...
</servlet>

上記の文字列値はアンエスケープされ、タイトルに追加されます。

Company Inc.<br><i style='color:red'>Staging</i>

サポートされているManagerコマンド

Managerアプリケーションが処理方法を知っているすべてのコマンドは、次のような単一のリクエストURIで指定されます。

http://{host}:{port}/manager/text/{command}?{parameters}

ここで、{host}{port}はTomcatが稼働しているホスト名とポート番号を表し、{command}は実行したいManagerコマンドを表し、{parameters}はそのコマンドに固有のクエリパラメーターを表します。以下の図では、ご自身のインストールに合わせてホストとポートを適切にカスタマイズしてください。

コマンドは通常、HTTP GETリクエストによって実行されます。/deployコマンドには、HTTP PUTリクエストによって実行される形式があります。

共通パラメーター

ほとんどのコマンドは、以下のクエリパラメーターの1つ以上を受け入れます。

  • path - 扱っているウェブアプリケーションのコンテキストパス(先頭のスラッシュを含む)。ROOTウェブアプリケーションを選択するには、「/」を指定します。
    :Managerアプリケーション自体に対して管理コマンドを実行することはできません。
    pathパラメーターが明示的に指定されていない場合、パスとバージョンは、configパラメーターから標準のContext命名ルールを使用して導出されます。configパラメーターが存在しない場合は、warパラメーターから導出されます。
  • version - 並列デプロイメント機能で使用されるこのウェブアプリケーションのバージョン。パスが必要な場所で並列デプロイメントを使用する場合、パスに加えてバージョンを指定する必要があり、一意である必要があるのはパスだけでなくパスとバージョンの組み合わせです。
    pathが明示的に指定されていない場合、versionパラメーターは無視されます。
  • war - ウェブアプリケーションアーカイブ (WAR) ファイルのURL、またはウェブアプリケーションを含むディレクトリのパス名、またはContext設定".xml"ファイル。以下のいずれかの形式でURLを使用できます。
    • file:/absolute/path/to/a/directory - ウェブアプリケーションの展開されたバージョンを含むディレクトリの絶対パス。このディレクトリは、指定したコンテキストパスに何の変更もなくアタッチされます。
    • file:/absolute/path/to/a/webapp.war - ウェブアプリケーションアーカイブ (WAR) ファイルの絶対パス。これは/deployコマンドに対してのみ有効であり、そのコマンドで許容される唯一の形式です。
    • file:/absolute/path/to/a/context.xml - Context設定要素を含むウェブアプリケーションContext設定".xml"ファイルの絶対パス。
    • directory - ホストのアプリケーションベースディレクトリ内のウェブアプリケーションコンテキストのディレクトリ名。
    • webapp.war - ホストのアプリケーションベースディレクトリ内にあるウェブアプリケーションのWARファイル名。

各コマンドはtext/plain形式(つまり、HTMLマークアップのないプレーンなASCII)で応答を返します。これにより、人間もプログラムも簡単に読み取ることができます。応答の最初の行は、要求されたコマンドが成功したかどうかを示すOKまたはFAILのいずれかで始まります。失敗した場合、最初の行の残りの部分には、発生した問題の説明が含まれます。一部のコマンドには、以下に説明するように追加の情報行が含まれます。

国際化に関する注意 - Managerアプリケーションはメッセージ文字列をリソースバンドルで検索するため、文字列がプラットフォーム向けに翻訳されている可能性があります。以下の例では、メッセージの英語版を示します。

新しいアプリケーションアーカイブ (WAR) をリモートでデプロイ

https://:8080/manager/text/deploy?path=/foo

このHTTP PUTリクエストでリクエストデータとして指定されたウェブアプリケーションアーカイブ(WAR)ファイルをアップロードし、対応する仮想ホストのappBaseディレクトリにインストールして開始します。appBaseに追加されるWARファイルの名前は、指定されたパスから導出されます。アプリケーションは後で/undeployコマンドを使用してアンデプロイ(および対応するWARファイルの削除)できます。

このコマンドはHTTP PUTリクエストによって実行されます。

WARファイルには、/META-INF/context.xmlにContext設定XMLファイルを含めることで、Tomcat固有のデプロイメント設定を含めることができます。

URLパラメーターには以下が含まれます。

  • update: trueに設定すると、既存の更新はまずアンデプロイされます。デフォルト値はfalseです。
  • tag: タグ名を指定すると、デプロイされたウェブアプリをタグまたはラベルと関連付けることができます。ウェブアプリケーションがアンデプロイされても、必要に応じて後でそのタグのみを使用して再デプロイできます。
  • config : file:/absolute/path/to/a/context.xml形式のContext設定".xml"ファイルのURL。これは、Context設定要素を含むウェブアプリケーションContext設定".xml"ファイルの絶対パスでなければなりません。

- このコマンドは、/undeployコマンドの論理的な逆です。

インストールと起動が成功した場合、次のような応答を受け取ります。

OK - Deployed application at context path /foo

そうでない場合、応答はFAILで始まり、エラーメッセージが含まれます。考えられる問題の原因には以下が含まれます。

  • パス/fooにアプリケーションがすでに存在します

    現在実行中のすべてのウェブアプリケーションのコンテキストパスは一意である必要があります。したがって、このコンテキストパスを使用している既存のウェブアプリケーションをアンデプロイするか、新しいウェブアプリケーションに別のコンテキストパスを選択する必要があります。このエラーを回避するために、URLのパラメーターとしてupdateパラメーターをtrueの値で指定することができます。その場合、デプロイメントを実行する前に既存のアプリケーションに対してアンデプロイが実行されます。

  • 例外が発生しました

    新しいウェブアプリケーションを起動しようとしているときに例外が発生しました。詳細についてはTomcatのログを確認してください。考えられる原因としては、/WEB-INF/web.xmlファイルの解析に関する問題、またはアプリケーションのイベントリスナーやフィルターの初期化時に不足しているクラスが見つかったことなどが挙げられます。

ローカルパスから新しいアプリケーションをデプロイ

指定されたコンテキストpath(他のウェブアプリケーションで使用されていないもの)にアタッチされた新しいウェブアプリケーションをデプロイして起動します。このコマンドは、/undeployコマンドの論理的な逆です。

このコマンドはHTTP GETリクエストによって実行されます。デプロイコマンドには、いくつかの異なる使用方法があります。

以前にデプロイされたウェブアプリをデプロイ

https://:8080/manager/text/deploy?path=/footoo&tag=footag

これは、tag属性を使用して以前にデプロイされたウェブアプリケーションをデプロイするために使用できます。Managerウェブアプリの作業ディレクトリには、以前にデプロイされたWARが含まれていることに注意してください。それを削除すると、デプロイが失敗します。

URLでディレクトリまたはWARをデプロイ

Tomcatサーバー上にあるウェブアプリケーションディレクトリまたは".war"ファイルをデプロイします。pathが指定されていない場合、パスとバージョンはディレクトリ名またはWARファイル名から導出されます。warパラメーターは、ディレクトリまたはウェブアプリケーションアーカイブ(WAR)ファイルのURL(file:スキームを含む)を指定します。WARファイルを参照するURLのサポートされる構文は、java.net.JarURLConnectionクラスのJavadocページで説明されています。WARファイル全体を参照するURLのみを使用してください。

この例では、Tomcatサーバー上のディレクトリ/path/to/fooにあるウェブアプリケーションが、/footooという名前のウェブアプリケーションコンテキストとしてデプロイされます。

https://:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo

この例では、Tomcatサーバー上の".war"ファイル/path/to/bar.warが、/barという名前のウェブアプリケーションコンテキストとしてデプロイされます。pathパラメーターがないため、コンテキストパスは".war"拡張子なしのウェブアプリケーションアーカイブファイルの名前にデフォルトで設定されることに注意してください。

https://:8080/manager/text/deploy?war=file:/path/to/bar.war

ホストのappBaseからディレクトリまたはWARをデプロイ

ホストのappBaseディレクトリにあるウェブアプリケーションディレクトリまたは".war"ファイルをデプロイします。パスとオプションのバージョンは、ディレクトリ名またはWARファイル名から導出されます。

この例では、TomcatサーバーのホストappBaseディレクトリ内のfooというサブディレクトリにあるウェブアプリケーションが、/fooという名前のウェブアプリケーションコンテキストとしてデプロイされます。使用されるコンテキストパスがウェブアプリケーションディレクトリの名前であることに注意してください。

https://:8080/manager/text/deploy?war=foo

この例では、TomcatサーバーのホストappBaseディレクトリ内にある".war"ファイルbar.warが、/barという名前のウェブアプリケーションコンテキストとしてデプロイされます。

https://:8080/manager/text/deploy?war=bar.war

Context設定".xml"ファイルを使用してデプロイ

ホストのdeployXMLフラグがtrueに設定されている場合、Context設定".xml"ファイルとオプションの".war"ファイルまたはウェブアプリケーションディレクトリを使用してウェブアプリケーションをデプロイできます。Context".xml"設定ファイルを使用してウェブアプリケーションをデプロイする場合、コンテキストpathは使用されません。

Context設定".xml"ファイルには、Tomcatのserver.xml設定ファイルで構成されたかのように、ウェブアプリケーションContextの有効なXMLを含めることができます。以下に例を示します。

<Context path="/foobar" docBase="/path/to/application/foobar">
</Context>

オプションのwarパラメーターがウェブアプリケーションの".war"ファイルまたはディレクトリのURLに設定されている場合、Context設定".xml"ファイルで構成されているdocBaseはすべて上書きされます。

以下に、Context設定".xml"ファイルを使用してアプリケーションをデプロイする例を示します。

https://:8080/manager/text/deploy?config=file:/path/context.xml

以下に、Context設定".xml"ファイルとサーバー上にあるウェブアプリケーション".war"ファイルを使用してアプリケーションをデプロイする例を示します。

https://:8080/manager/text/deploy
 ?config=file:/path/context.xml&war=file:/path/bar.war

デプロイに関する注意点

ホストがunpackWARs=trueで構成されており、WARファイルをデプロイした場合、WARはホストのappBaseディレクトリ内のディレクトリに展開されます。

アプリケーションのWARまたはディレクトリがホストのappBaseディレクトリにインストールされており、ホストがautoDeploy=trueで構成されている場合、コンテキストパスはディレクトリ名または".war"拡張子なしのWARファイル名と一致する必要があります。

信頼できないユーザーがウェブアプリケーションを管理できる場合のセキュリティのために、ホストのdeployXMLフラグをfalseに設定できます。これにより、信頼できないユーザーが設定XMLファイルを使用してウェブアプリケーションをデプロイすること、およびホストの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またはディレクトリがホストのappBaseディレクトリにインストールされており、ホストがautoDeploy=trueで構成されている場合、コンテキストパスはディレクトリ名または".war"拡張子なしのWARファイル名と一致する必要があります。

  • ホストのウェブアプリケーションディレクトリ内のウェブアプリケーションのみインストールできます

    ホストのdeployXMLフラグがfalseに設定されている場合、ホストのappBaseディレクトリ外のウェブアプリケーションディレクトリまたは".war"ファイルをデプロイしようとすると、このエラーが発生します。

現在デプロイされているアプリケーションを一覧表示

https://: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

既存のアプリケーションをリロード

https://: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.xmlファイルの変更を反映するため)はサポートされていません。これは、ウェブアプリケーションが展開されたディレクトリからデプロイされた場合にのみ機能します。WARファイルを使用している場合、変更を反映させるには、アプリケーションをundeployしてからdeployするか、updateパラメーター付きでdeployし直す必要があります。

OSおよびJVMプロパティを一覧表示

https://:8080/manager/text/serverinfo

Tomcatのバージョン、OS、JVMプロパティに関する情報を一覧表示します。

エラーが発生した場合、応答はFAILで始まり、エラーメッセージが含まれます。考えられる問題の原因には以下が含まれます。

  • 例外が発生しました

    システムプロパティを列挙しようとして例外が発生しました。詳細についてはTomcatのログを確認してください。

利用可能なグローバルJNDIリソースを一覧表示

https://: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行が続き、各行はコロン(":")文字で区切られたフィールドで構成されます。以下に示すとおりです。

  • グローバルリソース名 - このグローバルJNDIリソースの名前。<ResourceLink>要素のglobal属性で使用されます。
  • グローバルリソースタイプ - このグローバルJNDIリソースの完全修飾Javaクラス名。

エラーが発生した場合、応答はFAILで始まり、エラーメッセージが含まれます。考えられる問題の原因には以下が含まれます。

  • 例外が発生しました

    グローバルJNDIリソースを列挙しようとして例外が発生しました。詳細についてはTomcatのログを確認してください。

  • グローバルJNDIリソースが利用できません

    実行中のTomcatサーバーは、グローバルJNDIリソースなしで設定されています。

セッション統計

https://:8080/manager/text/sessions?path=/examples

ウェブアプリケーションのデフォルトセッションタイムアウト、および実際のタイムアウト時間の1分間隔の範囲内にある現在アクティブなセッションの数を表示します。例えば、Tomcatを再起動し、/examplesウェブアプリのJSPサンプルの一つを実行した後、次のような結果が得られることがあります。

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

セッションの期限切れ

https://: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パラメーターの有無です。

既存のアプリケーションを開始

https://:8080/manager/text/start?path=/examples

停止したアプリケーションに再起動を指示し、再び利用可能にします。停止と開始は、例えば、アプリケーションが必要とするデータベースが一時的に利用できなくなった場合に役立ちます。ユーザーが継続的にデータベース例外に遭遇するのを許容するよりも、このデータベースに依存するウェブアプリケーションを停止する方が通常は良いでしょう。

このコマンドが成功した場合、次のような応答が表示されます。

OK - Started application at context path /examples

そうでない場合、応答はFAILで始まり、エラーメッセージが含まれます。考えられる問題の原因には以下が含まれます。

  • 例外が発生しました

    ウェブアプリケーションを起動しようとして例外が発生しました。詳細についてはTomcatのログを確認してください。

  • 無効なコンテキストパスが指定されました

    コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。

  • パス/fooにコンテキストが存在しません

    指定されたコンテキストパスには、デプロイされたアプリケーションがありません。

  • コンテキストパスが指定されていません

    pathパラメーターは必須です。

既存のアプリケーションを停止

https://:8080/manager/text/stop?path=/examples

既存のアプリケーションに、利用不可にするよう指示しますが、デプロイ状態は維持します。アプリケーションが停止中に受信されたリクエストはHTTPエラー404となり、このアプリケーションはアプリケーションリストコマンドで「停止中」と表示されます。

このコマンドが成功した場合、次のような応答が表示されます。

OK - Stopped application at context path /examples

そうでない場合、応答はFAILで始まり、エラーメッセージが含まれます。考えられる問題の原因には以下が含まれます。

  • 例外が発生しました

    ウェブアプリケーションを停止しようとして例外が発生しました。詳細についてはTomcatのログを確認してください。

  • 無効なコンテキストパスが指定されました

    コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。

  • パス/fooにコンテキストが存在しません

    指定されたコンテキストパスには、デプロイされたアプリケーションがありません。

  • コンテキストパスが指定されていません pathパラメーターは必須です。

既存のアプリケーションをアンデプロイ

https://:8080/manager/text/undeploy?path=/examples

警告 - このコマンドは、この仮想ホストのappBaseディレクトリ(通常は「webapps」)内に存在するウェブアプリケーションのアーティファクトをすべて削除します。これにより、存在する場合はアプリケーションの.WARファイル、展開形式でのデプロイまたは.WAR展開によって生成されたアプリケーションディレクトリ、および$CATALINA_BASE/conf/[enginename]/[hostname]/ディレクトリからのXML Context定義が削除されます。単にアプリケーションをサービスから外したい場合は、代わりに/stopコマンドを使用してください。

既存のアプリケーションに、正常にシャットダウンし、Tomcatから削除するよう指示します(これにより、このコンテキストパスは後で再利用できるようになります)。さらに、この仮想ホストのappBaseディレクトリ(通常は「webapps」)に存在する場合、ドキュメントルートディレクトリも削除されます。このコマンドは、/deployコマンドの論理的な逆です。

このコマンドが成功した場合、次のような応答が表示されます。

OK - Undeployed application at context path /examples

そうでない場合、応答はFAILで始まり、エラーメッセージが含まれます。考えられる問題の原因には以下が含まれます。

  • 例外が発生しました

    ウェブアプリケーションをアンデプロイしようとして例外が発生しました。詳細についてはTomcatのログを確認してください。

  • 無効なコンテキストパスが指定されました

    コンテキストパスはスラッシュ文字で始まる必要があります。ROOTウェブアプリケーションを参照するには「/」を使用します。

  • 名前/fooのコンテキストは存在しません

    指定した名前のデプロイ済みアプリケーションはありません。

  • コンテキストパスが指定されていません pathパラメーターは必須です。

メモリリークの検出

https://:8080/manager/text/findleaks[?statusLine=[true|false]]

メモリリーク検出診断は、完全なガベージコレクションをトリガーします。本番システムでは、細心の注意を払って使用してください。

メモリリーク検出診断は、ウェブアプリケーションが停止、リロード、またはアンデプロイされた際にメモリリークを引き起こしたかどうかを特定しようとします。結果は常にプロファイラで確認する必要があります。この診断は、StandardHostの実装によって提供される追加機能を使用します。StandardHostを継承しないカスタムホストが使用されている場合は機能しません。

Javaコードから明示的に完全なガベージコレクションをトリガーすることは、信頼できないと文書化されています。さらに、使用されるJVMによっては、-XX:+DisableExplicitGCのように明示的なGCトリガーを無効にするオプションがあります。診断が正常に完全なGCを実行したことを確認したい場合は、GCロギング、JConsoleなどのツールを使用して確認する必要があります。

このコマンドが成功した場合、次のような応答が表示されます。

/leaking-webapp

応答にステータス行を含めたい場合は、リクエストにstatusLineクエリパラメーターをtrueの値で含めてください。

停止、リロード、またはアンデプロイされたウェブアプリケーションの各コンテキストパスのうち、以前の実行からのクラスがまだメモリにロードされており、メモリリークを引き起こしているものは、新しい行に一覧表示されます。アプリケーションが複数回リロードされている場合、複数回一覧表示されることがあります。

コマンドが成功しない場合、応答はFAILで始まり、エラーメッセージが含まれます。

コネクターSSL/TLS暗号情報

https://:8080/manager/text/sslConnectorCiphers

SSLコネクター/暗号診断は、各コネクターに現在設定されている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証明書チェーン情報

https://:8080/manager/text/sslConnectorCerts

SSLコネクター/証明書診断は、各仮想ホストに現在設定されている証明書チェーンを一覧表示します。

応答は次のようになります。

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信頼済み証明書情報

https://:8080/manager/text/sslConnectorTrustedCerts

SSLコネクター/証明書診断は、各仮想ホストに現在設定されている信頼済み証明書を一覧表示します。

応答は次のようになります。

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設定のリロード

https://:8080/manager/text/sslReload?tlsHostName=name

TLS設定ファイル(証明書および鍵ファイル。これはserver.xmlの再解析をトリガーしません)をリロードします。すべてのホストのファイルをリロードするには、tlsHostNameパラメーターを指定しないでください。

OK - Reloaded TLS configuration for [_default_]

スレッドダンプ

https://: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情報

https://: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:
...

設定を保存

https://:8080/manager/text/save

パラメーターを指定せずにこのコマンドを実行すると、サーバーの現在の設定がserver.xmlに保存されます。既存のファイルは、必要に応じてバックアップとして名前が変更されます。

デプロイされたウェブアプリケーションのパスと一致するpathパラメーターを指定すると、そのウェブアプリケーションの設定は、現在のホストのxmlBaseにある適切に命名されたcontext.xmlファイルに保存されます。

このコマンドを使用するには、StoreConfig MBeanが存在する必要があります。通常、これはStoreConfigLifecycleListenerを使用して設定されます。

コマンドが成功しない場合、応答はFAILで始まり、エラーメッセージが含まれます。

サーバーのステータス

以下のリンクから、サーバーのステータス情報を表示できます。manager-statusロールまたは他のmanager-xxxロールのいずれかが、このページへのアクセスを許可します。

https://:8080/manager/status
https://:8080/manager/status/all

サーバーのステータス情報をHTML形式で表示します。

https://:8080/manager/status?XML=true

サーバーのステータス情報をXML形式で表示します。XML形式には、ウェブアプリケーションごとの詳細な統計は含まれません。

https://:8080/manager/status?JSON=true
https://:8080/manager/status/all?JSON=true

サーバーのステータス情報をJSON形式で表示します。JSON形式には、スレッドごとの状態情報は含まれません。アクティブな監視やサーバーのステータスアラート(Grafanaなど)のためのクライアント可視化ツールを使用している場合、Managerが提供するJSON出力は、最も簡単で安全なソリューションを提供する可能性が高いです。

まず、サーバーとJVMのバージョン番号、JVMプロバイダー、OS名と番号、そしてアーキテクチャタイプが表示されます。

次に、JVMのメモリ使用量に関する情報があります。

次に、Tomcat AJPとHTTPコネクターに関する情報があります。両方とも同じ情報が利用可能です。

  • スレッド情報:最大スレッド数、最小および最大スペアスレッド数、現在のスレッド数、現在のビジースレッド数。

  • リクエスト情報:最大処理時間と処理時間、リクエストおよびエラーカウント、受信バイト数と送信バイト数。

  • JSON形式を使用しない場合、ステージ、時間、送信バイト、受信バイト、クライアント、VHost、およびリクエストを含むスレッドの状態が表示されます。既存のすべてのスレッドが表に一覧表示されます。考えられるスレッドステージのリストは以下の通りです。

    • 「リクエストの解析と準備」:リクエストヘッダーが解析されているか、リクエストボディを読み取るために必要な準備(転送エンコーディングが指定されている場合)が行われています。

    • 「サービス」:スレッドがリクエストを処理し、応答を生成しています。このステージは「リクエストの解析と準備」ステージの後に続き、「完了」ステージの前に来ます。このステージには常に少なくとも1つのスレッドがあります(サーバーのステータスページ)。

    • 「完了」:リクエスト処理の終了。出力バッファに残っている応答の残りはクライアントに送信されます。このステージの後には、接続を維持するのが適切であれば「Keep-Alive」が続き、適切でなければ「Ready」が続きます。

    • 「Keep-Alive」:クライアントが別のリクエストを送信した場合に備えて、スレッドがクライアントへの接続を維持します。別のリクエストを受信した場合、次のステージは「リクエストの解析と準備」になります。Keep-Aliveタイムアウト前にリクエストが受信されない場合、接続は閉じられ、次のステージは「Ready」になります。

    • 「Ready」:スレッドはアイドル状態であり、使用準備ができています。

/status/allコマンドを使用している場合、XML形式を除き、デプロイされている各ウェブアプリケーションに関する追加情報が利用可能になります。

JMXプロキシサーブレットの使用

JMXプロキシサーブレットとは

JMXプロキシサーブレットは、Tomcatの内部情報を取得および設定するための軽量プロキシです(またはMBeanを介して公開されたあらゆるクラス)。その使用方法はあまりユーザーフレンドリーではありませんが、Tomcatの内部を監視および変更するためのコマンドラインスクリプトを統合する上で非常に役立ちます。このプロキシでは、情報の取得と情報の設定の2つのことができます。JMXプロキシサーブレットを真に理解するためには、JMXについて一般的な理解が必要です。JMXが何であるかを知らない場合、混乱する準備をしてください。

JMXクエリコマンド

これは次の形式を取ります。

http://webserver/manager/jmxproxy/?qry=STUFF

ここでSTUFFは、実行したいJMXクエリです。例えば、実行したいクエリは次のとおりです。

  • qry=*%3Atype%3DRequestProcessor%2C* --> type=RequestProcessor。これは、リクエストを処理できるすべてのワーカーを特定し、その状態を報告します。
  • qry=*%3Aj2eeType=Servlet%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

以下のパラメーターを指定する必要があります。

  1. get: 完全なBean名
  2. att: フェッチしたい属性
  3. 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の内部をいじる時です!設定コマンドの一般的な形式は次のとおりです。

http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE

そのため、3つのリクエストパラメーターを指定する必要があります。

  1. set: 完全なBean名
  2. att: 変更したい属性
  3. val: 新しい値

すべてがうまくいけば、OKと表示され、そうでない場合はエラーメッセージが表示されます。例えば、ErrorReportValveのデバッグをその場でオンにしたいとします。以下を実行すると、デバッグが10に設定されます。

https://:8080/manager/jmxproxy/
 ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
 &att=debug&val=10

そして私の結果は(環境によって異なります)

Result: ok

不正な値を渡した場合に表示されるのはこちらです。私が使用したURLはこれです。デバッグを「cow」に設定しようとします。

https://: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

例えば、ServicefindConnectors()メソッドを呼び出すには、以下を使用します。

https://:8080/manager/jmxproxy/
 ?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=

Antを使用したManagerコマンドの実行

上記で文書化されているように、HTTPリクエストを介してManagerコマンドを実行する機能に加えて、TomcatにはAnt(バージョン1.4以降)ビルドツール用の便利なタスク定義セットが含まれています。これらのコマンドを使用するには、以下のセットアップ操作を実行する必要があります。

  • Antのバイナリディストリビューションをhttps://ant.dokyumento.jpからダウンロードしてください。バージョン1.4以降を使用する必要があります。
  • Antディストリビューションを便利なディレクトリにインストールします(本説明の残りの部分ではANT_HOMEと呼びます)。
  • $ANT_HOME/binディレクトリをPATH環境変数に追加します。
  • Tomcatユーザーデータベースに、manager-scriptロールを含むユーザー名/パスワードの組み合わせを少なくとも1つ設定してください。

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="https://: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>

注:上記のインポートによるリソースタスクの定義は、Ant 1.7で追加されたリソースデータタイプを上書きします。リソースデータタイプを使用したい場合は、Antのネームスペースサポートを使用してcatalina-tasks.xmlを修正し、Tomcatタスクを独自のネームスペースに割り当てる必要があります。

これで、ant deployのようなコマンドを実行してTomcatの実行中のインスタンスにアプリケーションをデプロイしたり、ant reloadでTomcatにリロードさせたりできます。また、このbuild.xmlファイル内の興味深い値のほとんどは、置換可能なプロパティとして定義されているため、コマンドラインからそれらの値を上書きできます。例えば、実際のマネージャーパスワードを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 この属性は、マネージャーコマンド処理エラーによってAntの実行が終了するのを避けたい場合に使用されます。デフォルトはtrueです。エラー出力をキャプチャしたい場合はfalseに設定する必要があります。そうしないと、何もキャプチャされる前に実行が終了します。
この属性はマネージャーコマンドの実行のみに作用し、誤ったコマンド属性や欠落したコマンド属性は依然としてAntの実行終了を引き起こします。
いいえ

また、埋め込みの<redirector>要素もサポートしており、inputinputstringinputencodingを除くすべての属性を指定できます。これらは受け入れられますが、このコンテキストでは意味がないため使用されません。<redirector>要素の属性の詳細については、Antマニュアルを参照してください。

以下に、この出力リダイレクトサポートの利用方法を示すビルドファイルの抜粋例を示します。

    <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"属性を使用している場合は、各タスク呼び出しの出力がファイルに追加されて表示されます。