Exec

説明

システムコマンドを実行します。os属性が指定されている場合、コマンドは指定されたオペレーティングシステムのいずれかでApache Antが実行された場合にのみ実行されます。

フォークされたプログラムと対話することはできません。入力データを送信する唯一の方法は、input属性とinputstring属性を使用することです。また、Ant 1.6以降、フォークされたプログラムで入力を読み込もうとすると、EOF(-1)が返されることに注意してください。これは、Ant 1.5ではそのような試行がブロックされていたこととは異なります。

プロジェクトのbasedirを基準とした相対パスを使用して実行可能ファイルを実行する場合は、一部のオペレーティングシステムでvmlauncher=falseを使用する必要がある場合があります。しかし、これでも失敗する可能性があります(Solaris 8/9が問題として報告されています)。resolveexecutable属性の方が信頼性が高く、次のような方法も有効です。

<property name="executable-full-path"
          location="../relative/path/to/executable"/>
<exec executable="${executable-full-path}" ...

Windowsユーザー

<exec>タスクはRuntime.execに委譲し、さらに::CreateProcessを呼び出します。このWin32関数が、呼び出しの正確なセマンティクスを定義します。特に、実行可能ファイルにファイル拡張子を付けない場合、.EXEファイルのみが検索され、.COM.CMD、または環境変数PATHEXTにリストされている他のファイルタイプは検索されません。これはシェルによってのみ使用されます。

.batファイルは、一般的に直接実行できません。通常は、/cスイッチを使用してコマンドシェル実行可能ファイルcmdを実行する必要があります。

<target name="help">
  <exec executable="cmd">
    <arg value="/c"/>
    <arg value="ant.bat"/>
    <arg value="-p"/>
  </exec>
</target>

よくある問題は、実行可能ファイルがPATHにないことです。エラーメッセージCannot run program "...":CreateProcess error=2. The system cannot find the path specified.が表示された場合は、PATH変数を確認してください。コマンドラインで直接コマンドを入力してください。Windowsがコマンドを見つければ、Antでも実行できるはずです。(そうでない場合は、ユーザーメーリングリストでヘルプを依頼してください。)Windowsがプログラムを実行できない場合は、プログラムのディレクトリをPATHに追加するか(set PATH=%PATH%;dirOfProgram)、ビルドファイルのexecutable属性に絶対パスを指定してください。

Cygwinユーザー

<exec>タスクは、executableパラメータに/bin/shなどのパスを認識しません。これは、Antが実行されているJVMが標準のWindows実行可能ファイルであり、Cygwin環境を認識していないためです(つまり、cygwin1.dllを読み込みません)。これに対する唯一の回避策は、CygwinでJVMをコンパイルすることです(自己責任で)。たとえば、OpenJDKのCygwin向けビルド手順を参照してください。

OpenVMSユーザー

executable<arg>要素を使用して指定されたコマンドは、一時的なDCLスクリプト内で指定されたとおりに実行されます。これにはいくつかの意味があります。

HPが提供するJVMは、OpenVMSの終了コードの規則に従っていません。このタスクでJVMを実行する場合、タスクは誤ってエラーが発生したと主張したり(またはエラーを黙って無視したり)する可能性があります。JAVA.EXEを実行するためにこのタスクを使用しないでください。fork属性をtrueに設定した<java>タスクを使用してください。このタスクは、JVMによる終了コードの解釈に従います。

RedHat S/390ユーザー

linux-390で報告されているように、Ant Execタスクを介して呼び出されるシェルスクリプトには、インタープリターを指定する必要があります。つまり、スクリプトは次のようなもので始める必要があります。

#!/bin/bash

そうでないと、タスクは次のように失敗します。

[exec] Warning: UNIXProcess.forkAndExec native error: Exec format error
[exec] Result: 255

Unix(類似)システムでのバックグラウンドプロセスとしてのAntの実行

Antをバックグラウンドプロセスとして実行する場合(ant &など)、spawnfalseに設定して<exec>タスクを使用する場合は、フォークされたプロセスに明示的な入力を提供する必要があります。そうでなければ、Antは標準入力から読み込もうとするため、中断されます。

パラメータ

属性 説明 必須
command すべてのコマンドライン引数を含む実行するコマンド。非推奨、代わりにexecutableとネストされた<arg>要素を使用してください。 2つのうちいずれか1つのみ
executable コマンドライン引数を含まない実行するコマンド。
dir コマンドを実行するディレクトリ。 いいえ。vmlaunchertrueの場合、現在の作業ディレクトリがデフォルトになります。それ以外の場合は、プロジェクトのbasedir
os コマンドを実行できるオペレーティングシステムのリスト。現在のOSの名前がこのリストに含まれている場合、コマンドが実行されます。OSの名前はJVMによって決定され、os.nameシステムプロパティに設定されます。 いいえ
osfamily <os>条件で使用されるOSファミリ。Ant 1.7以降 いいえ
spawn コマンドを生成するかどうか。
コマンドを生成すると、その出力はAntによってログに記録されません。
inputoutputerrorresultのプロパティ設定は、プロセスを生成するとアクティブになりません。
Ant 1.6以降
いいえ。デフォルトはfalse
output 出力を書き込むファイルの名前。エラーストリームもファイルまたはプロパティにリダイレクトされない場合、この出力に表示されます。 いいえ
error コマンドの標準エラーをリダイレクトするファイル。Ant 1.6以降 いいえ
logError この属性は、エラー出力をAntのログに表示したい場合、かつ出力をファイル/プロパティにリダイレクトする場合に使用します。エラー出力は、出力ファイル/プロパティに含まれません。errorまたはerrorProperty属性でエラーをリダイレクトする場合、これは効果がありません。Ant 1.6以降 いいえ
append 出力ファイルとエラーファイルを追記するか上書きするか。 いいえ。デフォルトはfalse
outputproperty コマンドの出力を格納するプロパティの名前。エラーストリームが別のファイルまたはストリームにリダイレクトされない限り、このプロパティにはエラー出力が含まれます。 いいえ
errorproperty コマンドの標準エラーを格納するプロパティの名前。Ant 1.6以降 いいえ
input 実行されたコマンドの標準入力から取得されるファイル。この属性はinputstring属性と相互排他的です。Ant 1.6以降 いいえ
inputstring 実行されたコマンドの入力ストリームとして機能する文字列。この属性はinput属性と相互排他的です。Ant 1.6以降 いいえ
resultproperty コマンドの戻りコードを格納するプロパティの名前。failonerror=falseの場合にのみ重要です。 いいえ
timeout 指定された時間(ミリ秒単位)内に終了しない場合、コマンドを停止します。 いいえ
failonerror 失敗を示す戻りコードでコマンドが終了した場合、ビルドプロセスを停止します。 いいえ。デフォルトはfalse
failifexecutionfails プログラムを開始できない場合、ビルドを停止します。 いいえ。デフォルトはtrue
newenvironment 新しい環境変数が指定されている場合、古い環境を伝播しません。 いいえ。デフォルトはfalse
vmlauncher 可能な場合は、JVMの実行機能を使用してコマンドを実行します。falseに設定されている場合、基になるOSのシェル(直接、またはantRunスクリプトを介して)が使用されます。一部のオペレーティングシステムでは、これにより、JVMでは通常利用できない機能にアクセスできます。Windowsでは、インタープリターではなくスクリプトを実行できます。dir属性で指定されたディレクトリに対する相対パスとして実行可能ファイルの名前を指定する場合は、vmlauncherfalseに設定する必要がある場合があります。 いいえ。デフォルトはtrue
resolveexecutable この属性がtrueの場合、実行可能ファイルの名前はまずプロジェクトのbasedirに対して解決され、それが存在しない場合は、指定されている場合は実行ディレクトリに対して解決されます。Unixシステムでは、ユーザーのパスにあるコマンドのみを実行する場合は、これをfalseに設定します。Ant 1.6以降 いいえ。デフォルトはfalse
searchpath この属性がtrueの場合、実行可能ファイルの場所を解決する際に、システムパスの環境変数が検索されます。Ant 1.6.3以降 いいえ。デフォルトはfalse
discardOutput 出力を完全に破棄するかどうか。この設定は、出力をファイルまたはプロパティにリダイレクトする設定とは互換性がありません。
これをtrueに設定すると、出力をファイル、プロパティにリダイレクトするかlogErrorを有効にしない限り、エラー出力も破棄されます。Ant 1.10.10以降
いいえ。デフォルトはfalse
discardError エラー出力を完全に破棄するかどうか。この設定は、エラー出力をファイルまたはプロパティにリダイレクトする設定、およびlogErrorとは互換性がありません。Ant 1.10.10以降 いいえ。デフォルトはfalse

<exec dir="${src}" executable="cmd.exe" os="Windows 2000" output="dir.txt">
  <arg line="/c dir"/>
</exec>

ネストされた要素として指定されたパラメータ

arg

コマンドライン引数は、ネストされた<arg>要素として指定する必要があります。コマンドライン引数を参照してください。

env

ネストされた<env>要素を使用して、システムコマンドに渡す環境変数を指定できます。

属性 説明 必須
key 環境変数の名前。
注記Ant 1.7以降、Windowsの場合、名前の大文字と小文字は区別されません。
はい
value 環境変数のリテラル値。 これらのうちいずれか1つのみ
path PATHのような環境変数の値。パスセパレータとして;または:を使用でき、Antはそれをプラットフォームのローカル慣例に変換します。
file 環境変数の値。Antによってファイルの絶対ファイル名に置き換えられます。

redirector

Ant 1.6.2以降

ネストされたI/Oリダイレクターを指定できます。一般的に、リダイレクターの属性は、タスクレベルで利用可能な対応する属性と同じように動作します。最も注目すべき特殊性は、後方互換性のために<exec>属性を保持することです。ファイルのマッピングはnullソースファイルを使用して行われます。そのため、すべてのMapperタイプが結果を返すわけではありません。結果が返されない場合、リダイレクトの仕様はタスクレベルの属性に戻ります。実際には、入力、出力、エラー出力ファイルのデフォルトを指定できることを意味します。

エラーと戻りコード

デフォルトでは、<exec>の戻りコードは無視されます。failonerrortrueに設定すると、失敗を示す戻りコード(OS固有)によってビルドが失敗します。または、resultpropertyをプロパティの名前に設定し、結果コードを割り当てることができます(不変性を除いて)。

プログラムの起動を試行した際にOS依存のエラーコードで失敗した場合、failifexecutionfailsfalseに設定されていない限り、<exec>はビルドを停止します。これは、プログラムが存在する場合は実行しますが、存在しない場合は何も実行しない場合に使用できます。

これらのエラーコードの意味は何ですか?それらはOS依存です。Windowsボックスでは、ドキュメントを参照する必要があります。error=2は「そのようなプログラムはありません」を意味し、通常はパスにないことを意味します。Antタスクからそのようなエラーが表示された場合は、通常、Antのバグではなく、マシンの構成の問題です。

X Windowシステムのディスプレイ1でemacsを起動します。

<exec executable="emacs">
  <env key="DISPLAY" value=":1.0"/>
</exec>

システムコマンドのPATH${basedir}/binを追加します。

<property environment="env"/>
<exec ... >
  <env key="PATH" path="${env.PATH}:${basedir}/bin"/>
</exec>

指定された${file}を使用して${browser}を起動し、Antプロセスを終了します。ブラウザは残ります。

<property name="browser" location="C:/Program Files/Internet Explorer/iexplore.exe"/>
<property name="file" location="ant/docs/manual/index.html"/>

<exec executable="${browser}" spawn="true">
    <arg value="${file}"/>
</exec>

blah before blahという文字列をcat実行可能ファイルに送信します。<inputfilterchain>を使用して、入力時にbeforeafterに置き換えます。出力はredirector.outファイルに送信され、同じ名前のプロパティに格納されます。同様に、エラー出力はファイルとプロパティの両方に送信され、どちらもredirector.errという名前になります。

<exec executable="cat">
    <redirector outputproperty="redirector.out"
                errorproperty="redirector.err"
                inputstring="blah before blah">
        <inputfilterchain>
            <replacestring from="before" to="after"/>
        </inputfilterchain>
        <outputmapper type="merge" to="redirector.out"/>
        <errormapper type="merge" to="redirector.err"/>
    </redirector>
</exec>

注記: 引数を単純なarg要素で指定し、スペースで区切ろうとしないでください。これにより、文字列全体を含む単一の引数のみが作成されます。

タイムアウト: タイムアウトが指定されている場合、タイムアウトに達するとサブプロセスがキルされ、ログにメッセージが出力されます。実行の戻り値は-1となり、failonerror=trueの場合、ビルドが停止しますが、それ以外の場合は無視されます。