К продолжению темы автоматизации каких-либо действий, в моем случае, сборки больших проектов, я бы хотел рассмотреть создание собственного действия, с использованием 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 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 действия:
На строке "
Спасибо и до скорого, как только будет что интересное и новое.
Владимир,спасибо большое,понравилось!
ReplyDeleteеще в тему,думаю,будет http://www.enterra.ru/blog/automation_builds_android_applications/