• 追加された行はこの色です。
  • 削除された行はこの色です。
---
keywords: [Ant]
description: JavaベースのビルドツールであるAntの使い方についてメモしています。
author: aterai
pubdate: 2003-09-25
---
#contents
* 概要 [#summary]
`Ant`は、`Java`ベースのビルドツールです。理論的には、`make`の欠点がない`make`の一種です(`Ant`翻訳より引用)。

このページでは、`Java`ベースのビルドツールである`Ant`の使い方についてメモしています。

* インストールと環境変数の設定 [#environments]
[http://ant.apache.org/ Apache Ant - Welcome]などからダウンロードしたアーカイブを展開して、そこを環境変数`ANT_HOME`に設定します。「システムのプロパティ→詳細設定→環境変数」で、`ANT_HOME`を新規作成、もしくは編集してください。
[https://ant.apache.org/ Apache Ant - Welcome]などからダウンロードしたアーカイブを展開して、そこを環境変数`ANT_HOME`に設定します。「システムのプロパティ→詳細設定→環境変数」で、`ANT_HOME`を新規作成、もしくは編集してください。

#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQsClLJ428I/AAAAAAAAAs0/B0-VGelgHu4/s800/ant_home.png)

また、`%ANT_HOME%\bin\ant.bat`を使うために、パスを通しておきます。「システムのプロパティ→詳細設定→環境変数」で、`Path`を編集してください。

#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQsClNPEp4I/AAAAAAAAAs8/hdtpb5o_pG4/s800/ant_path.png)

* タスクのサンプル [#of688f72]
`build.xml`、タスクなどのサンプルや、その他のちょっとした`Tips`などを、以下別ページにまとめています。

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

- [[AntのConditionタスクで条件分岐を行う>Ant/Condition]]

** AntのScriptタスク中でif文を使った条件分岐を行う [#Script]
`Condition`タスクの条件が複雑になるようなら、`<script language="javascript">`タスクなどで`if`文を使う方法もあります。

- [[AntのScriptタスク中でif文を使った条件分岐を行う>Ant/Script]]

** AntのTaskを自作 [#Task]
`Ant`の`Task`を自作し、これを利用する方法をテストします。

- [[AntのTaskを自作>Ant/Task]]

** AntのScriptタスクでJavaScriptを使用する [#NewProperty]
`Ant`の`Script`タスクで`JavaScript`を使用し、簡単なタスクを作成、実行します。

- [[AntのScriptタスクでJavaScriptを使用する>Ant/NewProperty]]

** AntのJarタスクで実行可能なJarファイルの作成 [#JarPackage]
`Ant`を使って、`Windows`環境などでダブルクリックすると起動する`Jar`ファイルを作成します。

- [[AntのJarタスクで実行可能なJarファイルの作成>Ant/JarPackage]]

** AntでOutOfMemoryErrorが発生する場合 [#OutOfMemoryError]
`Ant`を実行すると`OutOfMemoryError`が発生する場合の処置方法について解説しています。

- [[AntでOutOfMemoryErrorが発生する場合>Ant/OutOfMemoryError]]

** AntのプロパティファイルをXMLにする [#Properties]
プロパティファイルのエンコーディングなどを気にせずに使えるように、`Ant`のプロパティファイルを`XML`にしてみます。

- [[AntのプロパティファイルをXMLにする>Ant/Properties]]

** Antで子フォルダのbuild.xmlを全部実行 [#Subant]
`Subant`タスクを使って、一度に全部同じターゲットで子フォルダの`build.xml`を実行します。

- [[Antで子フォルダのbuild.xmlを全部実行>Ant/Subant]]

** Antのbasedirを子フォルダに変更して全部実行 [#basedir]
`basedir`をカレントディレクトリ(`${user.dir}`)とは別の場所に指定して、`ant.bat`を実行します。

- [[Antのbasedirを子フォルダに変更して全部実行>Ant/basedir]]

** AntでFindBugsを実行する [#FindBugs]
`Ant`から`FindBugs`を実行します。

- [[AntでFindBugsを実行する>Ant/FindBugs]]

** AntでPMDを実行する [#PMD]
`Ant`から`PMD`を実行します。

- [[AntでPMDを実行する>Ant/PMD]]

** AntでCheckstyleを実行する [#Checkstyle]
`Ant`から`Checkstyle`を実行します。

- [[AntでCheckstyleを実行する>Ant/Checkstyle]]

** AntでのコンパイルにErrorProneを使用する [#ErrorProne]
`Ant`でのコンパイルに`ErrorProne`を使用して、コードチェックを強化します。

- [[AntでError Proneを使用する>Ant/ErrorProne]]

** Antタスクの定義をスクリプト言語を使用して行う [#Scriptdef]
スクリプト言語(`Javascript`)を使用して、`FTPS`(`File Transfer Protocol over SSL/TLS`)で通信する`Ant`タスクを定義します。

- [[Antタスクの定義をスクリプト言語を使用して行う>Ant/Scriptdef]]

* targetのサンプル [#target]
** Checkstyleタスク [#Checkstyle]
** Scpタスク [#scp]
#code{{
  <condition property="have.checkstyle">
    <available file="${env.CHECKSTYLE_JAR}" />
  </condition>
  <target name="checkstyle" if="have.checkstyle">
    <taskdef resource="com/puppycrawl/tools/checkstyle/ant/checkstyle-ant-task.properties"
            classpath="${env.CHECKSTYLE_JAR}" />
    <mkdir dir="${build.reports}" />
    <checkstyle config="${user.dir}/checks.xml" failOnViolation="false">
      <formatter type="plain" />
      <formatter type="xml" toFile="${build.reports}/checkstyle-result.xml" />
      <fileset dir="${src.dir}">
        <include name="**/*.java" />
      </fileset>
    </checkstyle>
  <path id="jsch.path">
    <property name="scp.userid" value="${env.SCP_USERID}" />
    <property name="scp.server" value="${env.SCP_SERVER}" />
    <property name="scp.remotedir" value="${env.SCP_BASEDIR}" />
    <pathelement location="${ant.home}/lib/ant-jsch.jar" />
    <!-- http://www.jcraft.com/jsch/ からダウンロードして${ant.home}/lib/以下にコピー -->
    <pathelement location="${ant.home}/lib/jsch-0.1.53.jar" />
  </path>
  <target name="scp">
    <taskdef name="scp" classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp"
                     classpathref="jsch.path" />
    <!-- scp.userなどは、環境変数またはant scp -Dscp.user=fooなどで指定 -->
    <scp todir="${scp.user}@${scp.server}:${scp.remotedir}"
       keyfile="${user.home}/.ssh/id_rsa" trust="yes">
      <fileset refid="scp.upload.fileset" />
    </scp>
  </target>
}}

** ErrorProneタスク [#ErrorProne]
- [http://errorprone.info/ Error Prone]
-- [http://errorprone.info/docs/flags Command-line flags]

* その他 [#others]
** Java 9 マイグレーション [#java9]
- `javac`タスク
-- `error: package com.sun.java.swing.plaf.windows is not visible`などとエラーになる場合は、コンパイル引数に`--add-exports=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED`を追加
-- `error: package javax.activation is not visible`の場合は、コンパイル引数に`--add-modules=java.activation`を追加
#code{{
<target name="errorprone" depends="prepare-src, prepare-resource, prepare-web">
  <path id="errorprone.classpath">
    <!-- 環境変数などでerror_prone_ant-x.x.x.jarのあるディレクトリを指定 -->
    <fileset dir="${env.ERRORPRONE_HOME}">
      <include name="*.jar" />
    </fileset>
  </path>
  <componentdef name="errorprone" classname="com.google.errorprone.ErrorProneExternalCompilerAdapter"
                classpathref="errorprone.classpath" />
<target name="compile" depends="prepare-src, prepare-resource, prepare-web">
  <javac srcdir="${build.src}"
         includes="**/*.java"
         destdir="${build.dest}"
         encoding="${compile.encoding}"
         debug="${compile.debug}"
         optimize="${compile.optimize}"
         deprecation="${compile.deprecation}"
         includeAntRuntime="no"
         fork="true"
         classpathref="project.class.path">
    <errorprone />
    <compilerarg value="-J-Dfile.encoding=${compile.encoding}" />
    <compilerarg value="-J-Duser.language=${user.language}" />
    <compilerarg value="--add-exports=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED" />
    <compilerarg value="--add-modules=java.activation" />
    <compilerarg value="-Xlint:unchecked" />
    <!-- MultipleTopLevelClassesのチェックを無視する例 -->
    <compilerarg value="-Xep:MultipleTopLevelClasses:OFF" />
  </javac>
</target>
}}

** Scpタスク [#scp]
- `java`タスク
-- `Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessError: superclass access check failed: class example.WindowsClippedTitleTabbedPaneUI (in unnamed module @0x396038de) cannot access class com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI (in module java.desktop) because module java.desktop does not export com.sun.java.swing.plaf.windows to unnamed module @0x396038de`のようなエラーになる場合は`--add-opens=module/package=ALL-UNNAMED`などを`JVM`引数に追加
-- `Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/activation/ActivationDataFlavor`などのエラーがでる場合は、`--add-modules=java.activation`などを`JVM`引数に追加
#code{{
  <path id="jsch.path">
    <property name="scp.userid" value="${env.SCP_USERID}" />
    <property name="scp.server" value="${env.SCP_SERVER}" />
    <property name="scp.remotedir" value="${env.SCP_BASEDIR}" />
    <pathelement location="${ant.home}/lib/ant-jsch.jar" />
    <!-- http://www.jcraft.com/jsch/ からダウンロードして${ant.home}/lib/以下にコピー -->
    <pathelement location="${ant.home}/lib/jsch-0.1.53.jar" />
  </path>
  <target name="scp">
    <taskdef name="scp" classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp"
                     classpathref="jsch.path" />
    <!-- scp.userなどは、環境変数またはant scp -Dscp.user=fooなどで指定 -->
    <scp todir="${scp.user}@${scp.server}:${scp.remotedir}"
       keyfile="${user.home}/.ssh/id_rsa" trust="yes">
      <fileset refid="scp.upload.fileset" />
    </scp>
  </target>
<target name="run" depends="compile">
  <java classname="${main.class}" classpathref="project.class.path" fork="true">
    <jvmarg value="--add-opens=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED" />
    <jvmarg value="--add-modules=java.activation" />
  </java>
</target>
}}

* その他 [#others]
** `buildfile`オプション [#buildfile]
`build.xml`ファイルを作ってコマンドプロンプトから`ant.bat`を実行します。引数が無い場合、カレントフォルダにある`build.xml`が使用されます。
 ant

任意の`build.xml`を使いたいときは、以下のようなオプションを使って指定します。
 ant -buildfile "c:\hoge project\hoge_build.xml"
 ant -f "c:\hoge project\hoge_build.xml"

[[xyzzy]]などから、`ant.bat`をサブプロセス(KBD{C-x &})として実行する場合は、`-emacs`オプションを追加します。このオプションをつけると、[[xyzzy]]のバッファに表示されたエラー上でKBD{F10}キー(標準のキーバインドでは、KBD{F11}キーを押すと次のエラーへ移動)を押すだけで、そのエラーの出たファイルの該当する行に、自動的にジャンプすることができます。
 ant -emacs -buildfile "c:\hoge\build.xml"
 ant -e -f "c:\hoge\build.xml"

** `build.xml`ファイル [#buildxml]
ネットを検索すれば、いろんな`build.xml`が見つかるので、まずはその中からサンプルを選び、[http://ant.apache.org/manual/index.html マニュアル]([http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/index.html 日本語訳])を見ながら修正すると、手っ取り早く作成することができます。

- `build.xml`と`build.properties`のサンプル
-- http://ateraimemo.com/data/ant/build.zip
-- https://ateraimemo.com/data/ant/build.zip
-- この`build.zip`ファイルには、ソースコードのほかに、`build.xml`と`build.properties`を添付しています。`build.properties`は、環境依存しそうな記述を`build.xml`から抜き出したプロパティファイルです。[http://www.jdom.org/ JDOM]などから拾ってきた記述を追加、編集したりして作成しています。実際に使用する場合は、`build.properties`ファイルを環境に合わせて編集してください。そのまま使用する場合は、`build.xml`を展開し、`src/java`フォルダ以下にソースコード(`Shift_JIS`)を置いてください。

- [[Java Swing Tips>Swing]]以下のサンプル
-- http://ateraimemo.com/swing/toolbarlayout/src.zip
-- https://ateraimemo.com/swing/toolbarlayout/src.zip
-- このサイトの[[Java Swing Tips>Swing]]のサンプルに添付されている`build.xml`はすべて同一です。こちらは、「`build.xml`と`build.properties`のサンプル」とは違い、ソースコードは`UTF-8`で、`build.properties`ではなく、`xml`ファイル(`properties.xml`)をプロパティファイルとして使用しています。

* 参考リンク [#reference]
- [http://ant.apache.org/ Apache Ant]
- [http://ant.apache.org/manual/index.html Apache Ant Manual]
- [http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=xyzzy xyzzy Antモード]
- [https://ant.apache.org/ Apache Ant]
- [https://ant.apache.org/manual/index.html Apache Ant Manual]

* コメント [#comment]
#comment
#comment