Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

четверг, 4 июня 2009 г.

Использование фильтров в Apache Ant - ClassConstants

Apache Ant используется для компиляции, сборки и развертывания проектов на Java. Ant является стандартом де-факто в мире Java. Он предоставляет множество возможностей, одна из которых - это фильтрация (преобразование) содержимого обрабатываемых файлов. В данном сообщении рассмотрено использование фильтров в Ant.

Представьте, что при выполнении процесса сборки вашего приложения вам необходимо обработать некоторые текстовые файлы. Например, в одном файле необходимо заменить некоторые сочетания символов (tokens) на другие, а в другой файл должно быть записано содержимое нескольких файлом, т.е. произведена конкатенация файлов. В этом случае необходимо использовать фильтры Ant. Фильтры используются для обработки содержимого файлов при их копировании, перемещении. Работать с фильтрами могут следующие команды (tasks):

<сoncat>
<copy>
<loadfile>
<loadproperties>
<move>


Фильтры могут объединяться в цепочки фильтров (FilterChains), таким образом позволяя применить к обрабатываемому файлу несколько фильтров в определенной последовательности. Такой механизм является аналогом Unix pipes.

Рассмотрим имеющиеся фильтры:

ClassConstants

Выводит все константы (поля, объявленные final) Java-класса. Модификатор доступа не влияет на вывод. Рассмотрим пример: вывод констант класса в текстовый файл.

Класс следующий:

TestClassConstants.java:


package ru.testant;

import java.util.ArrayList;

public class TestClassConstants {

public final int A = 1;
protected final double B = 0.123;
private final String C = "test string";
private final ArrayList D = new ArrayList();
int E = 2;
}


после этого создадим следующую структуру каталогов (PROJECT_HOME - корневой каталог проекта):
PROJECT_HOME/build/classes
PROJECT_HOME/src/ru/testant


В каталог PROJECT_HOME/src/ru/testant поместим наш файл TestClassConstants.java

Затем создадим следующий файл сборки


build.xml:


<project name="ant-filters1" default="testcc" basedir=".">
<description>
Test ClassConstants Ant filter
</description>

<property name="src.dir" value="src"/>
<property name="build.dir" value="build/classes"/>

<target name="compile" description="Compile sources">
<javac srcdir="${src.dir}" destdir="${build.dir}"/>
</target>

<target name="testcc" description="Test ClassConstants filter" depends="compile">
<copy file="${build.dir}/ru/testant/TestClassConstants.class" encoding="ISO-8859-1" tofile="11.txt">
<filterchain>
<classconstants/>
</filterchain>
</copy>
</target>
</project>


и поместим его в корневой каталог проекта (т.е. PROJECT_HOME). Основное внимание надо обратить на цель testcc. В ней происходит копирование обработанного контента из файла TestClassConstants.class в файл 11.txt, который будет размещен в PROJECT_HOME. Кодировка ISO-8859-1 должна использоваться в этом фильтре, т.к. при ее использовании не происходит потери информации при перекодировании characters --> int и обратно.

Фильтр ClassConstants использует библиотеку Apache BCEL (Byte Code Engineering Library), которую надо скачать с сайта http://jakarta.apache.org/bcel и поместить в каталог ANT_HOME/lib (где ANT_HOME - каталог, куда установлен ANT). Этот каталог не надо указывать в classpath, поскольку JARы из него добавляются в classpath автоматически перед началом работы Ant.

В итоге, наш проект включает в себя следующие файлы:
  • PROJECT_HOME/build.xml

  • PROJECT_HOME/src/ru/testant/TestClassConstants.java

  • ANT_HOME/lib/bcel-5.2.jar


Затем вызывается цель testcc:

> ant testcc

Получившийся файл 11.txt имеет следующий вид:


11.txt:

A=1
B=0.123
C=test string


Видно, что константа D не сохранена в файл, поскольку она не является примитивным типом, а также не сохранено неконстантное поле E.

Если фильтр применить внутри команды <loadproperties>, то тогда константы класса будут загружены в виде свойств, где имя константы - будет именем свойства, а значение константы - значением свойства. Пример:


<loadproperties srcfile="${build.dir}/ru/testant/TestClassConstants.class" encoding="ISO-8859-1">
<filterchain>
<classconstants/>
</filterchain>
</loadproperties>

Комментариев нет:

Отправить комментарий

Постоянные читатели