К продолжению темы автоматизации каких-либо действий, в моем случае, сборки больших проектов, я бы хотел рассмотреть создание собственного действия, с использованием Java, и пример использования нового действия.
Подготовка
Все как и в прошлой статье, создадим:
- 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
- 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
Быстро дошли до самого вкусного. Начнем писать код, а именно:
- Создадим параметр, какое то поле текстовое
- Поработаем с FileSet, класс из Ant SDK для хранения и работы с путями к файлам и др.
- Создадим и обработаем главный вызов (точку входа) 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Ну и "типа" namespace в файле DoSomethingTask.properties в папке src: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() } } }
DoSomething=com.example.DoSomethingTaskПоехали
Осталось откомпилировать и получить .jar. Теперь перейдем к запуску, а именно создадим новый build.xml для запуска Ant действия:
На строке "
Спасибо и до скорого, как только будет что интересное и новое.
Владимир,спасибо большое,понравилось!
ReplyDeleteеще в тему,думаю,будет http://www.enterra.ru/blog/automation_builds_android_applications/