自作Antタスククラスの概要

  1. org.apache.tools.ant.Taskを継承する
  2. Antからは Task#execute() メソッドが呼ばれる
  3. 処理が失敗したときには org.apache.tools.ant.BuildException? を投げる
  4. Antタスクのパラメータは public void setXXX( type pXXX ) で受け取る。typeを指定するとAntが勝手に変換してくれる
  5. Antタスクに推奨されるオプションとその名前
    failonerror実行が失敗したらBuildException?例外を発生しなければならないか、それとも単にエラーを表示すればよいか制御するブール値。パラメータ確認の失敗は、このフラグにかかわらず常にエラーをスローします。
    destdir出力先ディレクトリ
    destfile出力先ファイル
    srcdirソースディレクトリ
    srcfileソースファイル
  6. org.apache.tools.ant.MatchingTask?を継承すると、getDirectoryScanner?()を使えるようになる。srcdir以下のファイルをすべて列挙するときなどに便利。
  7. サンプルコード
    public final class MyTask extends MatchingTask {
      /**
       * 出力ディレクトリ
       * このタスクにdestdirが無い場合にはnullのままです
       */
      private File destDir = null;
      
      /**
       * 入力ディレクトリ
       * このタスクにsrcdirが無い場合にはnullのままです
       */
      private File srcDir = null;
      
      /**
       * このタスクのfailOnError属性.
       * このタスクにfailOnError属性がない場合にはtrueがデフォルト値として設定されます
       */
      private boolean failOnError = true;
      
      /**
       * デフォルトコンストラクタ
       */
      public HelloAnt() {
        super();
      }
      
      /**
       * @param pDestDir destDir を設定。
       */
      public void setDestDir(final File pDestDir) {
        this.destDir = pDestDir;
      }
      
      /**
       * このタスクのfailOnError属性を受け取ります.
       * このタスクのfailOnError属性を受け取ります。属性が"true","yes","on"
       * の場合には引数にtrueが指定されます。
       * それ以外の時にはfalseが指定されます。
       * もしもこのタスクにfailOnError属性がない場合には、このメソッドは
       * 呼ばれません。
       * @param pFailOnError failOnError を設定。
       */
      public void setFailOnError(final boolean pFailOnError) {
        this.failOnError = pFailOnError;
      }
      
      /**
       * @param pSrcDir srcDir を設定。
       */
      public void setSrcDir(final File pSrcDir) {
        this.srcDir = pSrcDir;
      }
      
      /**
       * Antフレームワークから呼び出されるメソッド
       * @throws BuildException Antタスクの実行に失敗した
       */
      public void execute() throws BuildException {
        try {
          // 属性チェック
          if (srcDir == null) {
            throw new BuildException("srcdir attribute must be set!");
          }
          
          if (!srcDir.exists()) {
            throw new BuildException("srcdir does not exist!");
          }
          
          if (!srcDir.isDirectory()) {
            throw new BuildException("srcdir is not a directory!");
          }
          
          if (destDir == null) {
            throw new BuildException("destdir attribute must be set!");
          }
          
          if (!destDir.exists()) {
            throw new BuildException("destdir does not exist!");
          }
          
          if (!destDir.isDirectory()) {
            throw new BuildException("destdir is not a directory!");
          }
          
          log("SRCDIR  :" + srcDir.getAbsolutePath());
          log("DESTDIR :" + destDir.getAbsolutePath());
          log("failOnError :" + Boolean.toString(failOnError));
          
          DirectoryScanner ds = super.getDirectoryScanner(srcDir);
          String[] fileNames = ds.getIncludedFiles();
          
          for (int cnt = 0; cnt < fileNames.length; cnt++) {
            log("SRCFILE(" + cnt + ")=" + fileNames[cnt]);
          }
        } catch (BuildException ex) {
          if (failOnError) {
            throw ex;
          } else {
            log("Task Failed!");
          }
        }
      }
    }

Eclipseでの自作Antタスクの作成と実行

  1. 作成
    1. Eclipseプロジェクトの外部Jarに、
      C:\eclipse\plugins\org.apache.ant_1.6.2\lib\ant.jar
      を指定する
    2. Antでコンパイルとjar圧縮を行う
  2. 実行
    1. 作成したアーカーイブをtaskdefで指定してすると、デフォルト組込のタスクと同様に使用することができる
      <project name="AntExam" basedir="." default="exec_task">
        
        <!-- ******************************************************************* -->
        <!-- クラスパスの設定 -->
        <path id="class.path">
          <fileset dir="C:\eclipse\plugins\org.apache.ant_1.6.2\lib">
            <include name="*.jar" />
          </fileset>
          
          <fileset dir="lib/">
            <include name="*.jar" />
          </fileset>
        </path>
        
        <!-- ******************************************************************* -->
        <!-- MyTaskタスクの作成 -->
        <target name="make_task" depends="" description="antタスクを作成します">
          
          <javac srcdir="src" destdir="bin" classpathref="class.path" />
          
          <jar jarfile="lib/MyTask.jar">
            <fileset dir="bin">
              <include name="**/*.class" />
            </fileset>
          </jar>
          
        </target>
        
        <!-- ******************************************************************* -->
        <!-- MyTaskタスクの実行 -->
        <taskdef name="myTask" classname="com.foo.MyTask" classpathref="class.path" />
        
        <target name="exec_task" depends="make_task" description="antタスクを実行します">
          
          <myTask srcdir="src" destdir="bin" failonerror="yes" />
        </target>
        
      </project>

ネストした属性の受け取り方

  1. ネストした属性(<YYY>)は createYYY( ) の返値オブジェクトに格納される。ネスト属性は、何度も呼び出される可能性があるので、createYYY( )中でYYYを作成してListにaddしておき、execute( )でListから読み出して使うのが定跡。
    public class MyTask() extends Task{
      private List yyyList = new LinkedList();
      
      public YYY createYYY(){
        YYY yyy = new YYY();
        yyyList.add(yyy);
        return yyy;
      }
      
      public void execute() throws BuildException {
        
        for( Iterator it = yyyList.iterator() ; it.hasNext() ; ){
          YYY yyy = (YYY)it.next();
          log( yyy.toString() );
        }
      }
      
      public class YYY{
        private int num;
        public int getNum(){
          return num;
        }
        public void setNum( int pNum ){
          num = pNum;
        }
        public String toString(){
          return Integer.toString( num );
        }
      }
    }
     
    <MyTask>
      <YYY num="10"/>
    </MyTask>
  2. filesetを受け取る場合には、属性を格納するオブジェクトにorg.apache.ant.types.FileSet?を使うことができる
    public class MyTask() extends Task{
      List fileSetList = new LinkedList();
      
      public FileSet createFileSet(){
        FileSet fileSet = new FileSet();
        fileSetList.add( fileSet );
        return fileSet;
      }
      
      public void execute() throws BuildException {
        
        for( Iterator it = fileSetList.iterator() ; it.hasNext() ; ){
          FileSet fileSet = (FileSet)it.next();
          
          FileScanner fileScanner = fileSet.getDirectoryScanner(this.getProject());
          
          File basedir       = fileScanner.getBasedir();
          String dirName     = basedir.toString()
          
          String[] fileNames = fileScanner.getIncludedFiles();
          
          for (int cnt = 0; cnt < fileNames.length; cnt++) {
            log("FILESET(" + cnt + ")=" + basedir + System.getProperty("path.separator") + fileNames[cnt]);
          }
        }
      }
    }
     
    <MyTask>
      <fileset dir="." includes="**/*" />
    </MyTask>

参考文献

  1. Apache Ant 1.6.1 マニュアル/Apache Ant 1.6.1 Manual
  2. Apache Ant Java Doc
  3. @IT会議室 > Java Solution会議室 > javaからantを呼び出す

Java Ant


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2006-02-18 (土) 01:06:07 (6887d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=5eb56d24e9
ISBN10
ISBN13
9784061426061