概要

Antは、Javaベースのビルドツールです。理論的には、makeの欠点がないmakeの一種です(Ant翻訳より引用)。

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

インストールと環境変数の設定

Apache Ant - Welcomeなどからダウンロードしたアーカイブを展開して、そこを環境変数ANT_HOMEに設定します。「システムのプロパティ→詳細設定→環境変数」で、ANT_HOMEを新規作成、もしくは編集してください。

ant_home.png

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

ant_path.png

タスクのサンプル

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

AntのConditionタスクで条件分岐を行う

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

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

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

AntのTaskを自作

AntTaskを自作し、これを利用する方法をテストします。

AntのScriptタスクでJavaScriptを使用する

AntScriptタスクでJavaScriptを使用し、簡単なタスクを作成、実行します。

AntのJarタスクで実行可能なJarファイルの作成

Antを使って、Windows環境などでダブルクリックすると起動するJarファイルを作成します。

AntでOutOfMemoryErrorが発生する場合

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

AntのプロパティファイルをXMLにする

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

Antで子フォルダのbuild.xmlを全部実行

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

Antのbasedirを子フォルダに変更して全部実行

basedirをカレントディレクトリ(${user.dir})とは別の場所に指定して、ant.batを実行します。

AntでFindBugsを実行する

AntからFindBugsを実行します。

AntでPMDを実行する

AntからPMDを実行します。

Antタスクの定義をスクリプト言語を使用して行う

スクリプト言語(Javascript)を使用して、FTPS(File Transfer Protocol over SSL/TLS)で通信するAntタスクを定義します。

targetのサンプル

Checkstyleタスク

  <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}">
        <exclude name="**/module-info.java" />
        <include name="**/*.java" />
      </fileset>
    </checkstyle>
  </target>

module-info.java

  • 8.4ではJava 9module-info.javaに未対応なので、<exclude name="**/module-info.java" />などで回避
    C:\temp\jst\all.xml:47: Unable to process files: [C:\...\src\java\module-info.java]

Unable to create Root Module

Checkstyleのバージョン更新に伴うモジュールの廃止などの変更で、configファイル(上記の例では${user.dir}/checks.xml)が不正になった場合などに発生するようです。

  • 8.2
    • remove FileContentsHolder module as FileContents object is available for filters on TreeWalker in TreeWalkerAudit Event . Author: Timur, Roman Ivanov #3573
    • <module name="FileContentsHolder" />を削除する必要がある
    • LeftCurlyCheck: clarify behavior of 'nlow' option after removal of 'maxLineLength'. Author: Roman Ivanov #3855
    • <property name="maxLineLength" value="100"/>を削除する必要がある
      <module name="LeftCurly">
          <property name="maxLineLength" value="100"/>
      </module>
      
  • 8.1
    • Make SuppressionCommentFilter and SuppressWithNearbyCommentFilter children of TreeWalker. Author: Timur #4714
    • <module name="SuppressionCommentFilter" /><module name="TreeWalker">の子要素になるよう移動削除する必要がある

ErrorProneタスク

<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" />
  <javac srcdir="${build.src}"
         excludes="**/module-info.java"
         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="-Xlint:unchecked" />
    <!-- MultipleTopLevelClassesのチェックを無視する例 -->
    <compilerarg value="-Xep:MultipleTopLevelClasses:OFF" />
  </javac>
</target>
  • 上記のcomponentdefを使用する方法では、Java 9bootclasspath/p is no longer a supported option.とエラーになる errorprone:
       [javac] Compiling 2 source files to C:\Users\terai\jst\SelectionKeeper\target\classes
       [javac] -Xbootclasspath/p is no longer a supported option.
       [javac] Error: Could not create the Java Virtual Machine.
       [javac] Error: A fatal exception has occurred. Program will exit.
  • ドキュメントにあるように、javacタスクでcompiler="com.google.errorprone.ErrorProneAntCompilerAdapter"属性を追加使用するよう修正
<target name="errorprone" 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"
         compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"
         includeantruntime="false"
         classpathref="project.class.path">
    <compilerclasspath>
      <fileset dir="${env.ERRORPRONE_HOME}" includes="*.jar" />
    </compilerclasspath>
    <compilerarg value="-Xlint:unchecked" />
    <compilerarg value="-Xep:MultipleTopLevelClasses:OFF" />
  </javac>
</target>

Scpタスク

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

その他

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をサブプロセス(C-x &)として実行する場合は、-emacsオプションを追加します。このオプションをつけると、xyzzyのバッファに表示されたエラー上でF10キー(標準のキーバインドでは、F11キーを押すと次のエラーへ移動)を押すだけで、そのエラーの出たファイルの該当する行に、自動的にジャンプすることができます。

ant -emacs -buildfile "c:\hoge\build.xml"
ant -e -f "c:\hoge\build.xml"

build.xmlファイル

ネットを検索すれば、いろんなbuild.xmlが見つかるので、まずはその中からサンプルを選び、マニュアル(日本語訳)を見ながら修正すると、手っ取り早く作成することができます。

  • build.xmlbuild.propertiesのサンプル
    • https://ateraimemo.com/data/ant/build.zip
    • このbuild.zipファイルには、ソースコードのほかに、build.xmlbuild.propertiesを添付しています。build.propertiesは、環境依存しそうな記述をbuild.xmlから抜き出したプロパティファイルです。JDOMなどから拾ってきた記述を追加、編集したりして作成しています。実際に使用する場合は、build.propertiesファイルを環境に合わせて編集してください。そのまま使用する場合は、build.xmlを展開し、src/javaフォルダ以下にソースコード(Shift_JIS)を置いてください。
  • Java Swing Tips以下のサンプル
    • https://ateraimemo.com/swing/toolbarlayout/src.zip
    • このサイトのJava Swing Tipsのサンプルに添付されているbuild.xmlはすべて同一です。こちらは、「build.xmlbuild.propertiesのサンプル」とは違い、ソースコードはUTF-8で、build.propertiesではなく、xmlファイル(properties.xml)をプロパティファイルとして使用しています。

参考リンク

コメント