とりあえずよく使うAntの設定

ApacheMavenの流れにいってても、やはりAnt使っているトコはゴロゴロとあるわけで、最近pom.xmlばっか書いてて、もうbuild.xml書かんでよかばいね〜なんて思ってたら、build.xmlを書かねばということで、基本的な書き方。

とりあえず以下の事がやれれば、通常のプロジェクトではこと足りるんじゃないだろうか。

antコマンド

ant -f [ビルド・ファイル名] [実行するターゲット名]

とりあえずbuild.xml

<?xml version="1.0" ?>
<project default="hoge">
  <target name="hoge">
    <echo message="Hello HogeHoge"/>
  </target>
</project> 

コンパイルする

<target name="compile">
  <mkdir dir="build/classes" />
  <javac srcdir="src/main/java" destdir="build/classes"/>
</target>

jarファイルを作る

<jar jarfile="Hoge.jar" basedir=".">
  <fileset dir="build/src" includes="**/*.java" />
</jar>

warファイルを作る

<target name="war">
  <war destfile="hogeApp.war"
     webxml="hogeApp/WEB-INF/web.xml">
    <fileset dir="hogeApp" excludes="**/web.xml" />
  </war>
</target>

プロパティを設定する

<!-- プロパティを設定 -->
<property name="hoge" value="hoge value"/>
<!-- ファイルからプロパティを読み込み -->
<property file="build.properties" />
<!-- OSの環境変数から読込み -->
<property environment="env" />

クラスパスを設定する

<path id="dolceClasspath">
  <fileset dir="WEB-INF/lib">
    <include name="*.jar" />
  </fileset>
  <pathelement location="/usr/local/tomcat/common/lib/servlet-api.jar" />
</path>

javadocを作る

<target name="javadoc">
  <javadoc sourcepath="src/java
    excludes="**/bak/*"
    encoding="Windows-31J"
    packagenames="*"
    Windowtitle="my application"
    doctitle="my application"
    docencoding="iso-2022-jp"
    bottom="<center>&copy Arege Building</center>"
    Author="true"
    destdir="api"/>
</target>

JUnitテストを実行

JUnitを実行して下記のようなエラーが出て怒られた場合は{ANT_HOME}/libにJUnitのjarファイルがない場合なので、jarを入れておくか、Eclipseで実行している場合は、Antのパスに通すかをしておく。

BUILD FAILED

Ant could not find the task or a class this task relies upon.


<!-- ユニットテスト後にレポートを出力 -->
<junit printsummary="yes" haltonfailure="yes">
  <classpath>
    <fileset dir="WebContent/WEB-INF/lib">
      <include name="*.jar" />
    </fileset>
    <pathelement location="/usr/local/tomcat/common/lib/servlet-api.jar" />
  </classpath>
  <formatter type="plain"/>
    <test name="my.test.TestCase" haltonfailure="no" outfile="result">
  <formatter type="xml"/>
  </test>
  <batchtest fork="yes" todir="report">
    <fileset dir="src">
      <include name="**/Test*.java"/>
      <exclude name="**/TestAll.java"/>
    </fileset>
  </batchtest>
</junit> 

ディレクトリ、ファイル削除する

<!-- 個別に指定(*とかは使える) -->
<target name="clean">
  <delete dir="build/classes" />
  <delete file="classes/hoge.class" />
</target>

<!-- ファイルセットで指定 -->
<target name="clean">
  <delete>
    <fileset dir="hoge">
      <include name="*.jpg">
    </fileset>
  </delete>
</target>

ディレクトリを作成する

<target name="mkdir">
  <mkdir dir="${build.dest.classes}" />
</target>

コピーする

<target name="copy">
  <copy todir="build/src">
    <fileset dir="src/main/java"
      includes = "**/*.java"
      excludes = "**/*Test*"/>
  </copy>
</target>

メッセージを出力

<target name="msg">
  <echo message="Hello HogeHoge"/>
</target>

Tomcatを操作する

コマンド
プロパティにuser,passwordを記述してもいいが、
記述したくない場合は以下のようにコマンド実行時に引数を指定することもできる。

ant -Duser="admin" -Dpassword="admin"
<!-- タスクの定義 -->
<taskdef name="start" classname="org.apache.catalina.ant.StartTask"/>
<taskdef name="stop" classname="org.apache.catalina.ant.StopTask"/> 
<taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask"/>
<taskdef name="list" classname="org.apache.catalina.ant.ListTask"/>
<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/> 
<taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask"/>
    
<!-- 停止 -->
<target name="stop">
    <stop url="http://localhost:8080/manager"
        username="${user}"
        password="${password}"
        path="/exampleApp"/>
</target> 
    
<!-- 起動 -->
<target name="start">
    <start url="http://localhost:8080/manager"
        username="${user}"
        password="${password}"
        path="/exampleApp"/>
</target> 

<!-- 再起動 -->
<target name="reload">
    <reload url="http://localhost:8080/manager"
        username="${user}"
        password="${password}"
        path="/exampleApp"/>
</target> 

<!-- 一覧表示 -->
<target name="list">
    <list url="http://localhost:8080/manager"
        username="${user}"
        password="${password}"/>
</target> 

<!-- 配備 -->
<target name="deploy">
    <deploy url="http://localhost:8080/manager"
        username="${user}"
        password="${password}"
        path="/exampleApp"
        war="/usr/local/example.war"/>
</target>

<!-- 配備解除 -->
<target name="undeploy">
    <undeploy url="http://localhost:8080/manager"
        username="${user}"
        password="${password}"
        path="/exampleApp"/>
</target>

よく使うと思われるテンプレート

以下のフォルダ構成の場合はこのテンプレートでOKかな

テンプレート -- テストしてwarファイルを作成後にデプロイ --

<?xml version="1.0" encoding="utf-8"?>
<project name="sampleWebApp" default="all" basedir=".">
  
  <!-- プロパティ -->
  <property environment="env" />
  <property name="project" value="sampleWebApp" />
  <property name="app.name" value="sampleWebApp" />
  <property name="build.src" value="src" />
  <property name="build.dest" value="build" />
  <property name="build.dest.web.classes" value="WebContent/WEB-INF/classes" />
  <property name="build.dest.classes" value="${build.dest}/classes" />
  <property name="build.war" value="build/${project}.war" />
  
  <!-- Tomcat設定 -->
  <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/> 
  <taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask"/>
  
  <!-- ビルドからデプロイまで一通りのタスク -->
  <target name="all" depends="test,compile,war,undeploy,deploy" />
  
  <!-- クラスパス設定 -->
  <path id="myClasspath">
    <fileset dir="WebContent/WEB-INF/lib">
      <include name="*.jar" />
    </fileset>
    <pathelement location="${env.CATALINA_HOME}/lib/servlet-api.jar" />
  </path>
  
  <!-- warファイル作成 -->
  <target name="war" depends="cleanTest">
    <war destfile="${build.war}"
       webxml="WebContent/WEB-INF/web.xml">
      <fileset dir="WebContent">
        <exclude name="**/web.xml"/>
        <exclude name="**/src/**/*"/>
        <exclude name="**/src"/>
    </fileset>
    </war>
  </target>
  
  <!-- テストクラス削除 -->
  <target name="cleanTest">
    <delete file="${build.dest.web.classes}/**/Test*.class" />
    <!--
      <fileset dir="${build.dest.web.classes}">
        <include name="**/Test*"/>
      </fileset>
      -->
  </target>
  
  <!-- コンパイル -->
  <target name="compile" depends="clean,mkdir">
    <javac srcdir="${build.src}"
           destdir="${build.dest.classes}"
         classpathref="myClasspath">
    </javac>
  </target>
  
  <!-- コピー -->
  <target name="buildCopy">
    <copy todir="${build.dest.classes}">
      <fileset file="${build.dest.web.classes}">
      </fileset>
    </copy>
  </target>
  
  <!-- ディレクトリ作成 -->
  <target name="mkdir">
    <mkdir dir="${build.dest.classes}" />
  </target>
  
  <!-- 削除 -->
  <target name="clean">
    <delete dir="${build.dest}" />
  </target>
  
  <!-- 配備 -->
  <target name="deploy">
      <deploy url="http://localhost:8080/manager"
          username="${user}"
          password="${password}"
          path="/${app.name}"
          war="${build.war}"/>
  </target>
  
  <!-- 配備解除 -->
  <target name="undeploy">
      <undeploy url="http://localhost:8080/manager"
          username="${user}"
          password="${password}"
          path="/${app.name}"/>
  </target>
  
  <!-- ユニットテスト -->
  <target name="test" depends="buildCopy">
    <junit printsummary="yes" haltonfailure="yes">
      <classpath>
        <fileset dir="WebContent/WEB-INF/lib/">
          <include name="*.jar" />
        </fileset>
        <pathelement path="${build.dest.web.classes}" />
      </classpath>
        <formatter type="plain"/>
        <!--
      <test name="sample.MyTestSuite" haltonfailure="no" outfile="build/result">
        <formatter type="plain"/>
      </test>
      -->
      <batchtest fork="yes" todir="">
        <fileset dir="src/test/java">
          <include name="**/Test*.java"/>
        </fileset>
      </batchtest>
    </junit>
  </target>
</project>