---
title: AntでConditionタスクを使った条件分岐を行う
author: aterai
pubdate: 2007-03-13
description: Conditionタスクを使って、Targetタスクを実行するかどうかを振り分けます。
---
#contents

* 概要 [#summary]
`Condition`タスクを使って、例えばディレクトリの有無などによる条件で、`Target`タスクを実行するかどうかを振り分けます。

`Script`タスクを使用する方法は、[[AntのScriptタスク中でif文を使った条件分岐を行う>Ant/Script]]に移動しました。

* サンプルターゲット [#example]
#code{{
<!-- リソースディレクトリが存在すれば、プロパティ:have.resourcesは真 -->
<condition property="have.resources">
  <available file="${res.dir}" />
</condition>
<!-- ターゲット:prepare-resourceは、プロパティ:have.resourcesが
真の場合実行される -->
<target name="prepare-resource" depends="prepare" if="have.resources">
  <!-- 以下、ビルド用のリソースディレクトリを作って、リソースをコピー -->
  <mkdir dir="${build.res}" />
  <native2ascii encoding="UTF-8" src="${res.dir}" dest="${build.res}"
                includes="**/*.properties.utf8" ext="" />
  <copy todir="${build.res}">
    <fileset dir="${res.dir}" excludes="**/*.properties.*, **/*.bak" />
  </copy>
</target>
...省略...
<!-- ターゲット:compileで、ターゲット:prepare-resourceは呼び出されるが、
  実行されるかどうかはプロパティ:have.resourcesの値による -->
<target name="compile" depends="prepare-src, prepare-resource">
  <javac srcdir="${build.src}"
         destdir="${build.dest}"
         encoding="${compile.encoding}"
         debug="${compile.debug}"
         optimize="${compile.optimize}"
         source="${compile.source}"
         deprecation="${compile.deprecation}"
         classpathref="project.class.path"
  />
</target>
}}

- [[Resourceファイルからメニューバーを生成>Swing/ResourceMenuBar]]の[https://ateraimemo.com/swing/resourcemenubar/src.zip src.zip]などを参照

* 解説 [#explanation]
上記のサンプルでは、`Condition`タスクを使って、`have.resources`プロパティに真偽を代入しています。
上記のサンプルでは`Condition`タスクを使用して`have.resources`プロパティに真偽を代入しています。

`prepare-resource`ターゲットは、`properties`ファイルをユニコードエスケープしますが、これは、`have.resources`プロパティが真(`if="have.resources"`)の場合だけ実行されます。このため、リソースディレクトリが無い(エスケープする`properties`ファイルが無い)場合、あとで`compile`ターゲットで、`prepare-resource`ターゲットは呼び出されていますが、何もしないというサンプルになっています。
- `prepare-resource`ターゲットは`properties`ファイルをユニコードエスケープし、`have.resources`プロパティが真(`if="have.resources"`)の場合のみ実行
- このためリソースディレクトリが存在しない(エスケープする`properties`ファイルがない)場合、`compile`ターゲットで`prepare-resource`ターゲットが呼び出されて何も実行しない

----
以下は、同様に`Condition`タスクを使って、`lib`ディレクトリが存在する場合、その下にある`jar`ファイルをパスに含めるように上書きするためのサンプルです。

#code{{
<path id="project.class.path">
  <pathelement location="${build.dest}" />
  <pathelement path="${java.class.path}" />
</path>
<condition property="have.library">
  <available file="${lib.dir}" />
</condition>
<target name="init" if="have.library">
  <path id="project.class.path">
    <pathelement location="${build.dest}" />
    <fileset dir="${lib.dir}">
      <include name="*.jar" />
    </fileset>
    <pathelement path="${java.class.path}" />
  </path>
</target>
}}

- [[JToolBarでアイコンボタンを右寄せ>Swing/ToolBarLayout]]の、[https://ateraimemo.com/swing/toolbarlayout/src.zip src.zip]などを参照

* 参考リンク [#reference]
- [https://ant.apache.org/manual/Tasks/conditions.html Conditions Task]
- [https://ant.apache.org/manual/ifunless.html If and Unless on all tasks/nested elements]
-- `Ant 1.9.1`からタスクなどに`if`、`unless`属性を使用可能になった

* コメント [#comment]
#comment
- `Script`タスクを使用する方法は、[[AntのScriptタスク中でif文を使った条件分岐を行う>Ant/Script]]に移動しました。 -- &user(aterai); &new{2011-01-18 (火) 22:46:59};

#comment