TITLE:Antで条件分岐

Antで条件分岐

#adsense2

編集者:Terai Atsuhiro
作成日:2007-03-13
更新日:2024-01-19 (金) 11:15:36

Conditionタスクで条件分岐

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

サンプルターゲット

<!-- リソースディレクトリが存在すれば、プロパティ: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>

解説

上記のサンプルでは、Conditionタスクを使って、プロパティ:have.resourcesに真偽を代入しています。

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


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

<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>

参考リンク

Scriptタスクで条件分岐

Conditionタスクの条件が複雑になるようなら、以下のようにして <script language="javascript">タスクなどでif文を使う方法もあります。

サンプルターゲット

<target name="prepare-resource" depends="prepare">
  <script language="javascript"><![CDATA[
    importClass(java.io.File);
    if(new File(project.getProperty("res.dir")).exists()) {
      project.executeTarget("copy-resource");
    }
  ]]></script>
</target>
<target name="copy-resource">
  <mkdir dir="${build.res}" />
  <copy todir="${build.res}">
    <fileset dir="${res.dir}" excludes="**/*.properties.*, **/*.bak" />
  </copy>
</target>

参考リンク

コメント