TITLE:AntのTaskを自作

AntのTaskを自作

編集者:Terai Atsuhiro
作成日:
更新日:2019-10-02 (水) 13:50:15

概要

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

サンプルコード

import org.apache.tools.ant.*; import java.io.*; import java.util.*;

public class MoveImportDirTask extends Task{

 private File m_sourceDirectory;
 private File m_destinationDirectory;
 public MoveImportDirTask(){}
 public void setSrc(File sourceDir){
   m_sourceDirectory = sourceDir;
 }
 public void setDest(File destinationDirectory){
   m_destinationDirectory = destinationDirectory;
 }
 private void recursive(File dir, final Vector list){
   String[] contents = dir.list();
   for(int i=0;i<contents.length;i++){
     File sdir = new File(dir, contents[i]);
     if(sdir.isDirectory()) {
       recursive(sdir, list);
     }else{
       if(sdir.getName().endsWith(".java")) list.add(sdir);
     }
   }
 }
 public void execute() throws BuildException{
   if(m_sourceDirectory==null || !m_sourceDirectory.exists()){
     throw new BuildException("Source directory not found (src attribute): "+m_sourceDirectory);
   }
   if(m_destinationDirectory==null){
     throw new BuildException("Destination directory not set (dest attribute)");
   }
   m_destinationDirectory.mkdirs();
   int directoriesCreated = 0;
   int filesCopied = 0;
   try{
     Vector list = new Vector();
     recursive(m_sourceDirectory, list);
     Enumeration entries = list.elements();
     // Look at all the entries in the JAR
     while(entries.hasMoreElements()){
       File srcFile = (File)entries.nextElement();
       String packageName = null;
       BufferedReader in = new BufferedReader(new FileReader(srcFile));
       while(in.ready()){
         String s = in.readLine().trim();
         if(s.startsWith("package")){
           packageName = s.substring(7, s.lastIndexOf(";")).trim();
           break;
         }
       }
       in.close();
       if(packageName==null || packageName.length()<=0) continue;
       String dirName = packageName.replaceAll("\\.", "/");
       File newDirectory = new File(m_destinationDirectory, dirName);
       //log(newDirectory.getAbsolutePath());
       if(!newDirectory.exists() && newDirectory.getCanonicalPath()!=null){
         newDirectory.mkdirs();
         directoriesCreated++;
       }
       String javaFileName = dirName + File.separator + srcFile.getName();
       if(srcFile.exists()){
         // If we can find the .java file, copy it
         File destFile = new File(m_destinationDirectory, javaFileName);
         FileInputStream fis  = new FileInputStream(srcFile);
         FileOutputStream fos = new FileOutputStream(destFile);
         byte[] buffer = new byte[1024];
         int i = 0;
         while((i=fis.read(buffer))!=-1){
           fos.write(buffer,0,i);
         }
         fis.close();
         fos.close();
         filesCopied++;
       }
     }
   }catch(IOException e){
     throw new BuildException("Problem loading JAR file - "+e.getMessage());
   }
   log(directoriesCreated+" directories created, "+filesCopied+" files copied");
 }

}

解説

上記のサンプルは、javaファイルをimportに対応するディレクトリに移動するプラグインです。何処かで(失念)拾ってきたサンプルを改造して作ったものです。マニュアルのDeveloping with Ant(Writing Your Own Task)なども参考にしてください。

生成されたjarファイルを%ANT_HOME%\libに置き、以下の要領でタスクを定義します。

<target name="move-import">
  <taskdef name="MoveImportDir" 
           classname="jp.co.ant.misc.MoveImportDirTask"
           classpath="importdir.jar" />
  <MoveImportDir src="./src" dest="./src-clean" />
</target>

参考リンク

コメント