Sunday, May 29, 2011

Ant. Автоматизация.

Приветствую. Да, обещал, немного задержался с публикацией продолжения эпопеи с Ant.

К продолжению темы автоматизации каких-либо действий, в моем случае, сборки больших проектов, я бы хотел рассмотреть создание собственного действия, с использованием Java, и пример использования нового действия.

Подготовка
Все как и в прошлой статье, создадим:
  1. build.bat - для сборки в Windows, а именно установка путей к Java SDK и Ant SDK.
    @set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_23
    @set ANT_HOME=E:\Install\apache-ant-1.8.2
    @call ant
    @pause
  2. build.xml - последовательность действий для сборки нашего "действия", а именно компиляция Java класса и упаковка в .jar файл. Пусть проектом будет назван "DoSomethingTask", так же при сборке будет использоваться build.properties (см. ниже), а DoSomethingTask.properties пойдет в пакет .jar вместе с манифестом и главным классом нашего "действия".
    
     
    
     
      
     
    
     
      
      
     
    
     
      
      
       
       
        
       
      
     
    
     
    
    p.s. то что выводит парсер, немного отличается от того, что есть на самом деле. И build.properties:
    build.dir=build
    src.dir=src
    classes.dir=${build.dir}/classes
    jar.dir=${build.dir}/jar
    main-class=com.example.DoSomethingTask
Как создать собственное действие с параметрами?
Быстро дошли до самого вкусного. Начнем писать код, а именно:
  1. Создадим параметр, какое то поле текстовое
  2. Поработаем с FileSet, класс из Ant SDK для хранения и работы с путями к файлам и др.
  3. Создадим и обработаем главный вызов (точку входа) Ant действия
И так, как обычно, по ходу написания буду комментировать:
package com.example;

import java.util.ArrayList;

import javax.annotation.processing.FilerException;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;

// Task из Ant SDK
public class DoSomethingTask extends Task {
        // Набор из FileSet, просто переменная, не видна из build.xml
 private ArrayList list = new ArrayList();

        // Вот оно, какое то поле
 private String stringField = null;

        // Вот это интересный момент, по сути Ant поймет, что это и есть свойство
        // нашего действия, и оно будет доступно в build.xml как StringField
 public void setStringField(String stringField) {
  this.stringField = stringField;
 }

        // Аналогично выше описанного свойства
 public void addList(FileSet set) {
  list.add(set); // накапливаем все наборы файлов в списке
 }

        // точка входа, именно этот метод вызовется, когда Ant решит, что пора
 public void execute() {
                // простая проверка, удостовериться, что поле установлено
  if (stringField == null) {
   throw new BuildException("String field is invalid.");
  }

                // for each для каждого набора в списке
  for (FileSet set : list) {
   DirectoryScanner directoryScanner = set.getDirectoryScanner(getProject());
   directoryScanner.scan();
                        // теперь можно использовать след. функции для перебора всех файлов
                        // указанных в текущем наборе файлов
   // directoryScanner.getBasedir()
                        // directoryScanner.getIncludedFiles()
  }
 }
}
Ну и "типа" namespace в файле DoSomethingTask.properties в папке src:
DoSomething=com.example.DoSomethingTask
Поехали
Осталось откомпилировать и получить .jar. Теперь перейдем к запуску, а именно создадим новый build.xml для запуска Ant действия:

 
  
   
  
 

 

 
  
   
  
 
На строке "" указан путь к скомпилированному, нашему действию, пакету .jar. На самом деле, все написано из опыта и прямо тут, без проверки, прощу прощения если где промахнулся, пробуйте, разбирайтесь, основное донес, надеюсь.

Спасибо и до скорого, как только будет что интересное и новое.

1 comment:

  1. Владимир,спасибо большое,понравилось!
    еще в тему,думаю,будет http://www.enterra.ru/blog/automation_builds_android_applications/

    ReplyDelete