Краткое руководство по Ant

ANT - это еще один аккуратный инструмент. Это инструмент сборки на основе Java от Apache. Прежде чем углубляться в детали Apache Ant, давайте сначала разберемся, зачем нам вообще нужен инструмент сборки.

Нужен инструмент для сборки

В среднем разработчик тратит значительное количество времени на выполнение рутинных задач, таких как сборка и развертывание, которые включают:

  • Компиляция кода
  • Упаковка двоичных файлов
  • Развертывание двоичных файлов на тестовом сервере
  • Тестирование изменений
  • Копирование кода из одного места в другое

Для автоматизации и упрощения вышеуказанных задач полезен Apache Ant. Это инструмент для сборки и развертывания операционной системы, который можно запустить из командной строки.

История Apache Ant

  • Ant был создан Джеймсом Дунканом Дэвидсоном (оригинальным автором Tomcat).

  • Изначально он использовался для сборки Tomcat и входил в состав дистрибутива Tomcat.

  • Ant родился из проблем и сложностей, связанных с инструментом Apache Make.

  • Ant был продвинут как независимый проект в Apache в 2000 году. Последняя версия Apache Ant по состоянию на май 2014 года - 1.9.4.

Особенности Apache Ant

  • Ant - это наиболее полный доступный инструмент для сборки и развертывания Java.

  • Ant не зависит от платформы и может обрабатывать специфичные для платформы свойства, такие как разделители файлов.

  • Ant может использоваться для выполнения специфичных для платформы задач, таких как изменение времени изменения файла с помощью команды touch.

  • Скрипты Ant написаны с использованием простого XML. Если вы уже знакомы с XML, вы можете довольно быстро изучить Ant.

  • Ant хорош в автоматизации сложных повторяющихся задач.

  • Ant поставляется с большим списком предопределенных задач.

  • Ant предоставляет интерфейс для разработки пользовательских задач.

  • Ant можно легко вызвать из командной строки и интегрировать с бесплатными и коммерческими IDE.

Apache Ant Ant распространяется по лицензии Apache Software License, полноценной лицензии с открытым исходным кодом, сертифицированной в рамках инициативы с открытым исходным кодом.

Последнюю версию Apache Ant, включая полный исходный код, файлы классов и документацию, можно найти по адресу http://ant.apache.org.

Установка Apache Ant

Предполагается, что вы уже загрузили и установили Java Development Kit (JDK) на свой компьютер. Если нет, следуйте инструкциям здесь .

  • Убедитесь, что для переменной среды JAVA_HOME задана папка, в которой установлен JDK.

  • Загрузите двоичные файлы из http://ant.apache.org

  • Разархивируйте zip-файл в удобное место c: \ folder. используя Winzip, winRAR, 7-zip или аналогичные инструменты.

  • Создайте новую переменную среды с именем ANT_HOME это указывает на папку установки Ant, в данном случае c:\apache-ant-1.8.2-bin папка.

  • Добавьте путь к пакетному файлу Apache Ant в переменную среды PATH. В нашем случае это будетc:\apache-ant-1.8.2-bin\bin папка.

Проверка установки Apache Ant

Чтобы проверить успешную установку Apache Ant на вашем компьютере, введите в командной строке ant.

Вы должны увидеть результат, похожий на:

C:\>ant -version
Apache Ant(TM) version 1.8.2 compiled on December 20 2010

Если вы не видите приведенный выше результат, убедитесь, что вы правильно выполнили шаги установки.

Установка Eclipse

В этом руководстве также рассматривается интеграция Ant с Eclipse IDE. Следовательно, если вы еще не установили Eclipse, загрузите и установите Eclipse

Чтобы установить Eclipse:

  • Загрузите последние двоичные файлы Eclipse с www.eclipse.org

  • Разархивируйте двоичные файлы Eclipse в удобное место, например в c: \ folder.

  • Запустите Eclipse из c: \ eclipse \ eclipse.exe

Обычно файл сборки Ant, называемый build.xmlдолжен находиться в базовом каталоге проекта. Однако нет никаких ограничений на имя файла или его расположение. Вы можете использовать другие имена файлов или сохранить файл сборки в другом месте.

Для этого упражнения создайте в любом месте вашего компьютера файл с именем build.xml со следующим содержимым:

<?xml version="1.0"?>
   <project name="Hello World Project" default="info">
   <target name="info">
      <echo>Hello World - Welcome to Apache Ant!</echo>
   </target>
</project>

Обратите внимание, что перед объявлением xml не должно быть пустых строк или пробелов. Если вы разрешите их, при выполнении сборки муравья появится следующее сообщение об ошибке:

Соответствие цели инструкции обработки «[xX] [mM] [lL]» не допускается. Все файлы сборки требуютproject элемент и хотя бы один target элемент.

Элемент XML project имеет три атрибута:

Атрибуты Описание
имя Название проекта. (Необязательный)
по умолчанию Целевой объект по умолчанию для сценария сборки. Проект может содержать любое количество целей. Этот атрибут определяет, какую цель следует рассматривать по умолчанию. (Обязательный)
на основе Базовый каталог (или) корневая папка для проекта. (Необязательный)

Цель - это набор задач, которые вы хотите выполнять как одно целое. В нашем примере у нас есть простая цель - предоставить пользователю информационное сообщение.

Цели могут зависеть от других целей. Например,deploy цель может иметь зависимость от package цель, package цель может иметь зависимость от compileцель и так далее. Зависимости обозначаются с помощьюdependsатрибут. Например:

<target name="deploy" depends="package">
  ....
</target>
<target name="package" depends="clean,compile">
  ....
</target>
<target name="clean" >
  ....
</target>
<target name="compile" >
  ....
</target>

Целевой элемент имеет следующие атрибуты:

Атрибуты Описание
имя Название цели (обязательно)
смотря как Разделенный запятыми список всех целей, от которых зависит эта цель. (Необязательный)
описание Краткое описание цели. (необязательный)
если Разрешает выполнение цели на основе правильности условного атрибута. (необязательный)
если только Добавляет цель в список зависимостей указанной точки расширения. Точка расширения похожа на цель, но не имеет никаких задач. (Необязательный)

В echotask в приведенном выше примере - это тривиальная задача, которая печатает сообщение. В нашем примере он печатает сообщение Hello World .

Чтобы запустить файл сборки ant, откройте командную строку, перейдите в папку, в которой находится build.xml, и введите ant info. Вы также можете ввестиantвместо. Оба будут работать, потому чтоinfoявляется целью по умолчанию в файле сборки. Вы должны увидеть следующий результат:

C:\>ant
Buildfile: C:\build.xml

info: [echo] Hello World - Welcome to Apache Ant!

BUILD SUCCESSFUL
Total time: 0 seconds

C:\>

Файлы сборки Ant написаны в XML, что не позволяет объявлять переменные, как вы это делаете на вашем любимом языке программирования. Однако, как вы могли догадаться, было бы полезно, если бы Ant позволял объявлять переменные, такие как имя проекта, исходный каталог проекта и т. Д.

Муравей использует propertyэлемент, который позволяет указать свойства. Это позволяет изменять свойства от одной сборки к другой или от одной среды к другой.

По умолчанию Ant предоставляет следующие предварительно определенные свойства, которые можно использовать в файле сборки:

Свойства Описание
ant.file Полное расположение файла сборки.
ant.version Версия установки Apache Ant.
на основе Основание сборки, как указано в basedir атрибут project элемент.
ant.java.version Версия JDK, используемая Ant.
ant.project.name Название проекта, как указано в name атрибут project элемент.
ant.project.default-target Цель по умолчанию для текущего проекта.
ant.project.invoked-Target Разделенный запятыми список целей, которые были вызваны в текущем проекте.
ant.core.lib Полное расположение файла jar Ant.
муравейник Домашний каталог установки Ant.
ant.library.dir Домашний каталог для файлов библиотеки Ant - обычно папка ANT_HOME / lib.

Ant также делает системные свойства (пример: file.separator) доступными для файла сборки.

В дополнение к вышесказанному пользователь может определять дополнительные свойства с помощью propertyэлемент. В следующем примере показано, как определить свойство с именемsitename:

<?xml version="1.0"?>
<project name="Hello World Project" default="info">
   <property name="sitename" value="www.tutorialspoint.com"/>
   <target name="info">
      <echo>Apache Ant version is ${ant.version} - You are 
         at ${sitename} </echo>
   </target>
</project>

Запуск Ant в указанном выше файле сборки дает следующий результат:

C:\>ant
Buildfile: C:\build.xml

info: [echo] Apache Ant version is Apache Ant(TM) version 1.8.2  
      compiled on December 20 2010 - You are at www.tutorialspoint.com

BUILD SUCCESSFUL
Total time: 0 seconds
C:\>

Установка свойств непосредственно в файле сборки - это нормально, если вы работаете с несколькими свойствами. Однако для большого проекта имеет смысл хранить свойства в отдельном файле свойств.

Хранение свойств в отдельном файле дает следующие преимущества:

  • Это позволяет повторно использовать один и тот же файл сборки с разными настройками свойств для разных сред выполнения. Например, файл свойств сборки можно поддерживать отдельно для сред DEV, TEST и PROD.

  • Это полезно, когда вы не знаете заранее значения свойства (в конкретной среде). Это позволяет выполнять сборку в других средах, где значение свойства известно.

Жесткого правила не существует, но обычно файл свойств называется build.properties и размещается рядом с build.xmlфайл. Вы можете создать несколько файлов свойств сборки на основе сред развертывания, таких какbuild.properties.dev и build.properties.test.

Содержимое файла свойств сборки похоже на обычный файл свойств java. Они содержат по одному свойству на строку. Каждое свойство представлено парой имени и значения. Пары имени и значения разделяются знаком равенства (=). Настоятельно рекомендуется аннотировать свойства соответствующими комментариями. Комментарии перечислены с использованием символа решетки (#).

В следующем примере показан build.xml файл и связанный с ним build.properties файл:

build.xml

<?xml version="1.0"?>
<project name="Hello World Project" default="info">
   <property file="build.properties"/>
      <target name="info">
         <echo>Apache Ant version is ${ant.version} - You are 
            at ${sitename} </echo>
      </target>
</project>

build.properties

# The Site Name
sitename=www.tutorialspoint.com
buildversion=3.3.2

В приведенном выше примере sitename- настраиваемое свойство, которое сопоставляется с именем веб-сайта. Таким образом вы можете объявить любое количество настраиваемых свойств. Еще одно настраиваемое свойство, указанное в приведенном выше примере, - этоbuildversion, который в данном случае относится к версии сборки.

В дополнение к вышесказанному, Ant имеет ряд предопределенных свойств сборки, которые перечислены в предыдущем разделе, но еще раз представлены ниже.

Свойства Описание
ant.file Полное расположение файла сборки.
ant.version Версия установки Apache Ant.
на основе Основание сборки, как указано в basedir атрибут project элемент.
ant.java.version Версия JDK, используемая Ant.
ant.project.name Название проекта, как указано в name атрибут project элемент.
ant.project.default-target Цель по умолчанию для текущего проекта.
ant.project.invoked-Target Разделенный запятыми список целей, которые были вызваны в текущем проекте.
ant.core.lib Полное расположение файла jar Ant.
муравейник Домашний каталог установки Ant.
ant.library.dir Домашний каталог для файлов библиотеки Ant - обычно папка ANT_HOME / lib.

В примере, представленном в этой главе, используется ant.version встроенная собственность.

Ant предоставляет ряд предопределенных типов данных. Не путайте термин «типы данных» с теми, которые доступны в языке программирования, вместо этого рассматривайте их как набор служб, которые уже встроены в продукт.

Apache Ant предоставляет следующие типы данных.

Набор файлов

Типы данных набора файлов представляют собой набор файлов. Он используется как фильтр для включения или исключения файлов, соответствующих определенному шаблону.

Например, обратитесь к следующему коду. Здесь атрибут src указывает на исходную папку проекта.

Набор файлов выбирает все файлы .java в исходной папке, кроме тех, которые содержат слово «заглушка». К набору файлов применяется фильтр с учетом регистра, что означает, что файл с именем Samplestub.java не будет исключен из набора файлов.

<fileset dir="${src}" casesensitive="yes">
   <include name="**/*.java"/>
   <exclude name="**/*Stub*"/>
</fileset>

Набор шаблонов

Набор шаблонов - это шаблон, который позволяет легко фильтровать файлы или папки на основе определенных шаблонов. Шаблоны можно создавать с использованием следующих метасимволов:

  • ? - Соответствует только одному символу.

  • * - Соответствует нулю или множеству символов.

  • ** - Рекурсивно соответствует нулю или многим каталогам.

В следующем примере показано использование набора шаблонов.

<patternset id="java.files.without.stubs">
   <include name="src/**/*.java"/>
   <exclude name="src/**/*Stub*"/>
</patternset>

Затем набор шаблонов можно повторно использовать с набором файлов следующим образом:

<fileset dir="${src}" casesensitive="yes">
   <patternset refid="java.files.without.stubs"/>
</fileset>

Список файлов

Тип данных списка файлов аналогичен набору файлов, за исключением следующих отличий:

  • filelist содержит явно названные списки файлов и не поддерживает подстановочные знаки.

  • Тип данных filelist может применяться к существующим или несуществующим файлам.

Давайте посмотрим на следующий пример типа данных filelist. Здесь атрибутwebapp.src.folder указывает на исходную папку веб-приложения проекта.

<filelist id="config.files" dir="${webapp.src.folder}">
   <file name="applicationConfig.xml"/>
   <file name="faces-config.xml"/>
   <file name="web.xml"/>
   <file name="portlet.xml"/>
</filelist>

Набор фильтров

Используя тип данных набора фильтров вместе с задачей копирования, вы можете заменить определенный текст во всех файлах, который соответствует шаблону, значением замены.

Типичный пример - добавить номер версии в файл примечаний к выпуску, как показано в следующем коде.

<copy todir="${output.dir}">
   <fileset dir="${releasenotes.dir}" includes="**/*.txt"/>
   <filterset>
      <filter token="VERSION" value="${current.version}"/>
   </filterset>
</copy>

В этом коде:

  • Атрибут output.dir указывает на папку вывода проекта.

  • Атрибут releasenotes.dir указывает на папку с примечаниями к выпуску проекта.

  • Атрибут current.version указывает на папку текущей версии проекта.

  • Задача копирования, как следует из названия, используется для копирования файлов из одного места в другое.

Путь

В pathтип данных обычно используется для представления пути к классам. Записи в пути разделяются точкой с запятой или двоеточием. Однако эти символы заменяются во время выполнения символом разделителя пути исполняющей системы.

Путь к классам установлен для списка файлов и классов jar в проекте, как показано в примере ниже.

<path id="build.classpath.jar">
   <pathelement path="${env.J2EE_HOME}/${j2ee.jar}"/>
   <fileset dir="lib">
      <include name="**/*.jar"/>
   </fileset>
</path>

В этом коде:

  • Атрибут env.J2EE_HOME указывает на переменную окружения J2EE_HOME.

  • Атрибут j2ee.jar указывает на имя файла jar J2EE в базовой папке J2EE.

Теперь, когда мы узнали о типах данных в Ant, пора применить эти знания на практике. В этой главе мы построим проект. Цель этой главы - создать файл Ant, который компилирует классы java и помещает их в папку WEB-INF \ classes.

Рассмотрим следующую структуру проекта:

  • Скрипты базы данных хранятся в db папка.

  • Исходный код Java хранится в src папка.

  • Изображения, js, META-INF, стили (css) хранятся в war папка.

  • JSP хранятся в jsp папка.

  • Сторонние файлы jar хранятся в lib папка.

  • Файлы классов java хранятся в WEB-INF\classes папка.

Этот проект формирует Hello World Приложение для работы с факсом до конца этого руководства.

C:\work\FaxWebApplication>tree
Folder PATH listing
Volume serial number is 00740061 EC1C:ADB1
C:.
+---db
+---src
.  +---faxapp
.  +---dao
.  +---entity
.  +---util
.  +---web
+---war
   +---images
   +---js
   +---META-INF
   +---styles
   +---WEB-INF
      +---classes
      +---jsp
      +---lib

Вот файл build.xml, необходимый для этого проекта. Давайте рассмотрим это по частям.

<?xml version="1.0"?>
<project name="fax" basedir="." default="build">
   <property name="src.dir" value="src"/>
   <property name="web.dir" value="war"/>
   <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
   <property name="name" value="fax"/>

   <path id="master-classpath">
      <fileset dir="${web.dir}/WEB-INF/lib">
         <include name="*.jar"/>
      </fileset>
      <pathelement path="${build.dir}"/>
   </path>

   <target name="build" description="Compile source tree java files">
      <mkdir dir="${build.dir}"/>
      <javac destdir="${build.dir}" source="1.5" target="1.5">
         <src path="${src.dir}"/>
         <classpath refid="master-classpath"/>
      </javac>
   </target>
 
   <target name="clean" description="Clean output directories">
      <delete>
         <fileset dir="${build.dir}">
            <include name="**/*.class"/>
         </fileset>
      </delete>
   </target>
</project>

Во-первых, давайте объявим некоторые свойства для папок source, web и build.

<property name="src.dir" value="src"/>
<property name="web.dir" value="war"/>
<property name="build.dir" value="${web.dir}/WEB-INF/classes"/>

В этом примере:

  • src.dir относится к исходной папке проекта, в которой можно найти исходные файлы Java.

  • web.dir относится к исходной веб-папке проекта, где вы можете найти JSP, web.xml, css, javascript и другие файлы, связанные с Интернетом.

  • build.dir относится к выходной папке компиляции проекта.

Свойства могут относиться к другим свойствам. Как показано в приведенном выше примере,build.dir свойство делает ссылку на web.dir свойство.

В этом примере src.dir относится к исходной папке проекта.

Целью нашего проекта по умолчанию является compileцель. Но сначала давайте посмотрим наclean цель.

Чистая цель, как следует из названия, удаляет файлы в папке сборки.

<target name="clean" description="Clean output directories">
   <delete>
      <fileset dir="${build.dir}">
         <include name="**/*.class"/>
      </fileset>
   </delete>
</target>

Путь к мастер-классу содержит информацию о пути к классам. В этом случае он включает классы в папке сборки и файлы jar в папке lib.

<path id="master-classpath">
   <fileset dir="${web.dir}/WEB-INF/lib">
      <include name="*.jar"/>
   </fileset>
   <pathelement path="${build.dir}"/>
</path>

Наконец, цель сборки для сборки файлов. Первым делом создаем каталог сборки, если он не существует. Затем мы выполняем команду javac (указав jdk1.5 в качестве нашей целевой компиляции). Мы предоставляем исходную папку и путь к классам для задачи javac и просим ее удалить файлы классов в папку сборки.

<target name="build" description="Compile main source tree java files">
   <mkdir dir="${build.dir}"/>
   <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
      deprecation="false" optimize="false" failonerror="true">
      <src path="${src.dir}"/>
      <classpath refid="master-classpath"/>
   </javac>
</target>

Выполнение Ant для этого файла компилирует исходные файлы Java и помещает классы в папку сборки.

Результатом запуска файла Ant является следующий результат:

C:\>ant
Buildfile: C:\build.xml

BUILD SUCCESSFUL
Total time: 6.3 seconds

Файлы компилируются и помещаются в build.dir папка.

Документация необходима в любом проекте. Документация играет большую роль в поддержке проекта. Java упрощает документацию за счет использования встроенныхjavadocинструмент. Ant делает это еще проще, создавая документацию по запросу.

Как вы знаете, инструмент javadoc очень гибкий и позволяет использовать ряд параметров конфигурации. Ant предоставляет эти параметры конфигурации через задачу javadoc. Если вы не знакомы с javadocs, мы предлагаем вам начать с этого Руководства по документации Java .

В следующем разделе перечислены наиболее часто используемые параметры javadoc, которые используются в Ant.

Атрибуты

Источник можно указать с помощью sourcepath, sourcepathref или же sourcefiles.

  • sourcepath используется для указания папки исходных файлов (например, папки src).

  • sourcepathref используется для ссылки на путь, на который ссылается атрибут пути (например, delegates.src.dir).

  • sourcefiles используется, когда вы хотите указать отдельные файлы в виде списка, разделенного запятыми.

Путь назначения указывается с помощью destdir папка (например, build.dir).

Вы можете отфильтровать javadocзадача, указав имена пакетов, которые необходимо включить. Это достигается за счет использованияpackagenames атрибут, список файлов пакетов, разделенных запятыми.

Вы можете отфильтровать процесс javadoc, чтобы отображать только общедоступные, частные, пакетные или защищенные классы и члены. Это достигается за счет использованияprivate, public, package и protected атрибуты.

Вы также можете указать задаче javadoc включить информацию об авторе и версии, используя соответствующие атрибуты.

Вы также можете сгруппировать пакеты, используя group атрибут, чтобы стало легче ориентироваться.

Собираем все вместе

Продолжим нашу тему Hello worldПриложение для факса. Давайте добавим цель документации в наш проект приложения «Факс».

Ниже приведен пример задачи javadoc, используемой в нашем проекте. В этом примере мы указали javadoc для использованияsrc.dir в качестве исходного каталога и doc как цель.

Мы также настроили заголовок окна, заголовок и информацию о нижнем колонтитуле, которая отображается на страницах документации java.

Также мы создали три группы:

  • один для служебных классов в нашей исходной папке,
  • один для классов пользовательских интерфейсов и
  • один для классов, связанных с базой данных.

Вы можете заметить, что в группе пакетов данных есть два пакета - faxapp.entity и faxapp.dao.

<target name="generate-javadoc">
   <javadoc packagenames="faxapp.*" sourcepath="${src.dir}" 
      destdir="doc" version="true" windowtitle="Fax Application">
      <doctitle><![CDATA[= Fax Application =]]></doctitle>
      <bottom>
         <![CDATA[Copyright © 2011. All Rights Reserved.]]>
      </bottom>
      <group title="util packages" packages="faxapp.util.*"/>
      <group title="web packages" packages="faxapp.web.*"/>
      <group title="data packages" 
         packages="faxapp.entity.*:faxapp.dao.*"/>
   </javadoc>
   <echo message="java doc has been generated!" />
</target>

Давайте выполним задачу javadoc Ant. Он генерирует и помещает файлы документации Java в папку doc.

Когда javadoc target выполняется, он дает следующий результат:

C:\>ant generate-javadoc
Buildfile: C:\build.xml

java doc has been generated!

BUILD SUCCESSFUL
Total time: 10.63 second

Файлы документации java теперь присутствуют в doc папка.

Обычно файлы javadoc создаются как часть целевого выпуска или пакета.

Следующим логическим шагом после компиляции ваших исходных файлов java является создание архива java, то есть файла JAR. Создавать файлы JAR с помощью Ant довольно просто с помощьюjarзадача. Обычно используемые атрибуты задачи jar следующие:

Атрибуты Описание
на основе Базовый каталог для выходного файла JAR. По умолчанию это базовый каталог проекта.
компресс Советует Ant сжимать файл при создании JAR-файла.
держать сжатие В то время как compress атрибут применим к отдельным файлам, keepcompression Атрибут делает то же самое, но применяется ко всему архиву.
destfile Имя выходного файла JAR.
дублировать Сообщает Ant, что делать при обнаружении повторяющихся файлов. Вы можете добавить, сохранить или отключить повторяющиеся файлы.
исключает Советует Ant не включать эти разделенные запятыми список файлов в пакет.
исключает файл То же, что и выше, за исключением того, что файлы исключения указаны с использованием шаблона.
включает Инверсия исключает.
включает файл Инверсия excludesfile.
Обновить Советует Ant перезаписывать файлы в уже созданном JAR-файле.

Продолжая наши Hello WorldПроект приложения факса, давайте добавим новую цель для создания файлов jar. Но перед этим давайте рассмотрим задачу jar, приведенную ниже.

<jar destfile="${web.dir}/lib/util.jar"
   basedir="${build.dir}/classes"
   includes="faxapp/util/**"
   excludes="**/Test.class"
/>

Здесь web.dirуказывает путь к исходным веб-файлам. В нашем случае здесь будет размещен файл util.jar.

В build.dir Свойство в этом примере указывает на папку сборки, где можно найти файлы классов для util.jar.

В этом примере мы создаем файл jar с именем util.jar используя классы из faxapp.util.*пакет. Однако мы исключаем классы, заканчивающиеся на имя Test. Выходной файл jar будет помещен в папку lib веб-приложения.

Если мы хотим сделать util.jar исполняемым jar-файлом, нам нужно добавить manifest с Main-Class метаатрибут.

Таким образом, приведенный выше пример будет обновлен как:

<jar destfile="${web.dir}/lib/util.jar"
   basedir="${build.dir}/classes"
   includes="faxapp/util/**"
   excludes="**/Test.class">
   <manifest>
      <attribute name="Main-Class" value="com.tutorialspoint.util.FaxUtil"/>
   </manifest>
</jar>

Чтобы выполнить задачу jar, оберните ее в цель, чаще всего в цель сборки или пакета, и выполните их.

<target name="build-jar">
<jar destfile="${web.dir}/lib/util.jar"
   basedir="${build.dir}/classes"
   includes="faxapp/util/**"
   excludes="**/Test.class">
   <manifest>
      <attribute name="Main-Class" value="com.tutorialspoint.util.FaxUtil"/>
   </manifest>
</jar>
</target>

Запуск Ant для этого файла создает для нас файл util.jar.

Результатом запуска файла Ant является следующий результат:

C:\>ant build-jar
Buildfile: C:\build.xml

BUILD SUCCESSFUL
Total time: 1.3 seconds

Файл util.jar теперь помещен в папку вывода.

Создание файлов WAR с помощью Ant чрезвычайно просто и очень похоже на задачу создания файлов JAR. В конце концов, файл WAR, как и файл JAR, - это просто еще один ZIP-файл.

Задача WAR является расширением задачи JAR, но в нее есть несколько хороших дополнений для управления содержимым папки WEB-INF / classes и создания файла web.xml. Задача WAR полезна для указания конкретного макета файла WAR.

Поскольку задача WAR является расширением задачи JAR, все атрибуты задачи JAR применяются к задаче WAR.

Атрибуты Описание
webxml Путь к файлу web.xml
lib Группировка для указания того, что входит в папку WEB-INF \ lib.
классы Группировка для указания того, что входит в папку WEB-INF \ classes.
метаинф Задает инструкции по созданию файла MANIFEST.MF.

Продолжая наши Hello WorldПроект приложения факса, давайте добавим новую цель для создания файлов jar. Но прежде давайте рассмотрим военную задачу. Рассмотрим следующий пример:

<war destfile="fax.war" webxml="${web.dir}/web.xml">
   <fileset dir="${web.dir}/WebContent">
      <include name="**/*.*"/>
   </fileset>
   <lib dir="thirdpartyjars">
      <exclude name="portlet.jar"/>
   </lib>
   <classes dir="${build.dir}/web"/>
</war>

Как и в предыдущих примерах, web.dir переменная относится к исходной веб-папке, то есть к папке, содержащей файлы JSP, css, javascript и т. д.

В build.dirПеременная относится к выходной папке - здесь можно найти классы для пакета WAR. Как правило, классы будут объединены в папку WEB-INF / classes файла WAR.

В этом примере мы создаем военный файл с именем fax.war. Файл WEB.XML получается из исходной веб-папки. Все файлы из папки «WebContent» в сети копируются в файл WAR.

Папка WEB-INF / lib заполнена файлами jar из папки Thirdpartyjars. Однако мы исключаем portlet.jar, поскольку он уже присутствует в папке lib сервера приложений. Наконец, мы копируем все классы из веб-папки каталога сборки и помещаем в папку WEB-INF / classes.

Оберните военную задачу в цель Ant (обычно пакет) и запустите ее. Это создаст файл WAR в указанном месте.

Вполне возможно вложить классы, директоры lib, metainf и webinf, чтобы они располагались в разрозненных папках в любом месте структуры проекта. Но лучшие практики предполагают, что ваш веб-проект должен иметь структуру веб-содержимого, аналогичную структуре файла WAR. Структура проекта «Приложение для факса» основана на этом базовом принципе.

Чтобы выполнить военную задачу, оберните ее в цель, чаще всего в цель сборки или пакета, и запустите их.

<target name="build-war">
   <war destfile="fax.war" webxml="${web.dir}/web.xml">
   <fileset dir="${web.dir}/WebContent">
      <include name="**/*.*"/>
   </fileset>
   <lib dir="thirdpartyjars">
      <exclude name="portlet.jar"/>
   </lib>
   <classes dir="${build.dir}/web"/>
   </war>
</target>

Запуск Ant для этого файла создаст fax.war файл для нас.

Результатом запуска файла Ant является следующий результат:

C:\>ant build-war
Buildfile: C:\build.xml

BUILD SUCCESSFUL
Total time: 12.3 seconds

Файл fax.war теперь помещен в выходную папку. Содержимое файла войны будет:

fax.war:
   +---jsp             This folder contains the jsp files
   +---css             This folder contains the stylesheet files
   +---js              This folder contains the javascript files
   +---images          This folder contains the image files
   +---META-INF        This folder contains the Manifest.Mf
   +---WEB-INF
      +---classes   This folder contains the compiled classes
      +---lib       Third party libraries and the utility jar files
      WEB.xml       Configuration file that defines the WAR package

Мы изучили различные аспекты Ant, используя Hello World Факс веб-приложение по частям.

Пришло время собрать все вместе, чтобы создать полный и законченный файл build.xml. Рассматриватьbuild.properties и build.xml файлы следующим образом:

build.properties

deploy.path=c:\tomcat6\webapps

build.xml

<?xml version="1.0"?>

<project name="fax" basedir="." default="usage">
   <property file="build.properties"/>
   <property name="src.dir" value="src"/>
   <property name="web.dir" value="war"/>
   <property name="javadoc.dir" value="doc"/>
   <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
   <property name="name" value="fax"/>

   <path id="master-classpath">
      <fileset dir="${web.dir}/WEB-INF/lib">
         <include name="*.jar"/>
      </fileset>
      <pathelement path="${build.dir}"/>
   </path>
    
   <target name="javadoc">
      <javadoc packagenames="faxapp.*" sourcepath="${src.dir}" 
         destdir="doc" version="true" windowtitle="Fax Application">
      <doctitle><![CDATA[<h1>= Fax Application =</h1>]]>
      </doctitle>
      <bottom><![CDATA[Copyright © 2011. All Rights Reserved.]]>
      </bottom>
      <group title="util packages" packages="faxapp.util.*"/>
      <group title="web packages" packages="faxapp.web.*"/> 
      <group title="data packages" 
         packages="faxapp.entity.*:faxapp.dao.*"/>
      </javadoc>
   </target>

   <target name="usage">
      <echo message=""/>
      <echo message="${name} build file"/>
      <echo message="-----------------------------------"/>
      <echo message=""/>
      <echo message="Available targets are:"/>
      <echo message=""/>
      <echo message="deploy    --> Deploy application as directory"/>
      <echo message="deploywar --> Deploy application as a WAR file"/>
      <echo message=""/>
   </target>

   <target name="build" description="Compile main 
      source tree java files">
   <mkdir dir="${build.dir}"/>
      <javac destdir="${build.dir}" source="1.5" 
         target="1.5" debug="true"
         deprecation="false" optimize="false" failonerror="true">
      <src path="${src.dir}"/>
      <classpath refid="master-classpath"/>
      </javac>
   </target>

   <target name="deploy" depends="build" 
      description="Deploy application">
   <copy todir="${deploy.path}/${name}" 
      preservelastmodified="true">
      <fileset dir="${web.dir}">
         <include name="**/*.*"/>
      </fileset>
   </copy>
   </target>

   <target name="deploywar" depends="build" 
      description="Deploy application as a WAR file">
      <war destfile="${name}.war"
         webxml="${web.dir}/WEB-INF/web.xml">
         <fileset dir="${web.dir}">
            <include name="**/*.*"/>
         </fileset>
      </war>
      <copy todir="${deploy.path}" preservelastmodified="true">
         <fileset dir=".">
            <include name="*.war"/>
         </fileset>
      </copy>
   </target>
    

   <target name="clean" description="Clean output directories">
      <delete>
         <fileset dir="${build.dir}">
            <include name="**/*.class"/>
         </fileset>
      </delete>
   </target>
</project>

В этом примере:

  • Сначала мы объявляем путь к папке webapps в Tomcat в файле свойств сборки как deploy.path переменная.

  • Мы также объявляем исходную папку для файлов java в папке src.dir переменная.

  • Затем мы объявляем исходную папку для веб-файлов в web.dir переменная. javadoc.dir это папка для хранения документации java, а build.dir - это путь для хранения файлов вывода сборки.

  • Затем мы объявляем имя веб-приложения, которое fax в нашем случае.

  • Мы также определяем путь к мастер-классу, который содержит файлы JAR, находящиеся в папке WEB-INF / lib проекта.

  • Мы также включаем файлы классов, представленные в build.dir в пути мастер-класса.

  • Цель Javadoc создает документацию javadoc, необходимую для проекта, а цель использования используется для печати общих целей, которые присутствуют в файле сборки.

В приведенном выше примере показаны две цели развертывания: deploy и deploywar.

Целевой объект развертывания копирует файлы из веб-каталога в каталог развертывания, сохраняя дату и время последнего изменения. Это полезно при развертывании на сервере, поддерживающем горячее развертывание.

Чистая цель очищает все ранее созданные файлы.

Цель deploywar создает файл war, а затем копирует файл войны в каталог развертывания сервера приложений.

В предыдущей главе мы узнали, как упаковать приложение и развернуть его в папке.

В этой главе мы собираемся развернуть веб-приложение прямо в папку развертывания сервера приложений, а затем добавим несколько целей Ant для запуска и остановки служб. Давайте продолжимHello Worldвеб-приложение факса. Это продолжение предыдущей главы, новые компоненты выделены жирным шрифтом.

build.properties

# Ant properties for building the springapp

appserver.home=c:\\install\\apache-tomcat-7.0.19
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib

deploy.path=${appserver.home}/webapps

tomcat.manager.url=http://www.tutorialspoint.com:8080/manager
tomcat.manager.username=tutorialspoint
tomcat.manager.password=secret

build.xml

<?xml version="1.0"?>

<project name="fax" basedir="." default="usage">
   <property file="build.properties"/>
   <property name="src.dir" value="src"/>
   <property name="web.dir" value="war"/>
   <property name="javadoc.dir" value="doc"/>
   <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
   <property name="name" value="fax"/>

   <path id="master-classpath">
      <fileset dir="${web.dir}/WEB-INF/lib">
         <include name="*.jar"/>
      </fileset>
   <pathelement path="${build.dir}"/>
   </path>
    
   <target name="javadoc">
   <javadoc packagenames="faxapp.*" sourcepath="${src.dir}" 
      destdir="doc" version="true" windowtitle="Fax Application">
      <doctitle><![CDATA[<h1>= Fax Application 
         =</h1>]]></doctitle>
      <bottom><![CDATA[Copyright © 2011. All 
         Rights Reserved.]]></bottom>
      <group title="util packages" packages="faxapp.util.*"/>
      <group title="web packages" packages="faxapp.web.*"/>
      <group title="data packages" packages="faxapp.entity.*:faxapp.dao.*"/>
   </javadoc>
   </target>

   <target name="usage">
   <echo message=""/>
   <echo message="${name} build file"/>
   <echo message="-----------------------------------"/>
   <echo message=""/>
   <echo message="Available targets are:"/>
   <echo message=""/>
   <echo message="deploy    --> Deploy application as directory"/>
   <echo message="deploywar --> Deploy application as a WAR file"/>
   <echo message=""/>
   </target>

   <target name="build" description="Compile main 
      source tree java files">
   <mkdir dir="${build.dir}"/>
   <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
      deprecation="false" optimize="false" failonerror="true">
      <src path="${src.dir}"/>
      <classpath refid="master-classpath"/>
   </javac>
   </target>

   <target name="deploy" depends="build" description="Deploy application">
      <copy todir="${deploy.path}/${name}" 
         preservelastmodified="true">
         <fileset dir="${web.dir}">
            <include name="**/*.*"/>
         </fileset>
      </copy>
   </target>

   <target name="deploywar" depends="build" 
      description="Deploy application as a WAR file">
      <war destfile="${name}.war"
         webxml="${web.dir}/WEB-INF/web.xml">
         <fileset dir="${web.dir}">
            <include name="**/*.*"/>
         </fileset>
      </war>
      <copy todir="${deploy.path}" preservelastmodified="true">
         <fileset dir=".">
            <include name="*.war"/>
         </fileset>
      </copy>
   </target>
    

   <target name="clean" description="Clean output directories">
      <delete>
         <fileset dir="${build.dir}">
            <include name="**/*.class"/>
         </fileset>
      </delete>
   </target>
<!-- ============================================================ -->
<!-- Tomcat tasks -->
<!-- ============================================================ -->

<path id="catalina-ant-classpath">
<!-- We need the Catalina jars for Tomcat -->
<!--  * for other app servers - check the docs -->
   <fileset dir="${appserver.lib}">
      <include name="catalina-ant.jar"/>
   </fileset>
</path>

<taskdef name="install" classname="org.apache.catalina.ant.InstallTask">
   <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
   <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="list" classname="org.apache.catalina.ant.ListTask">
   <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="start" classname="org.apache.catalina.ant.StartTask">
   <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="stop" classname="org.apache.catalina.ant.StopTask">
   <classpath refid="catalina-ant-classpath"/>
</taskdef>

<target name="reload" description="Reload application in Tomcat">
   <reload url="${tomcat.manager.url}"username="${tomcat.manager.username}"
      password="${tomcat.manager.password}" path="/${name}"/>
</target>
</project>

В этом примере мы использовали Tomcat в качестве сервера приложений. Во-первых, в файле свойств сборки мы определили некоторые дополнительные свойства.

  • В appserver.home указывает на путь установки к серверу приложений Tomcat.

  • В appserver.lib указывает на файлы библиотеки в папке установки Tomcat.

  • В deploy.path теперь переменная указывает на папку webapp в Tomcat.

Приложения в Tomcat можно остановить и запустить с помощью приложения Tomcat Manager. URL-адрес приложения-менеджера, имя пользователя и пароль также указываются в файле build.properties. Затем мы объявляем новый CLASSPATH, содержащийcatalina-ant.jar. Этот файл jar требуется для выполнения задач Tomcat через Apache Ant.

Catalina-ant.jar выполняет следующие задачи:

Свойства Описание
InstallTask Устанавливает веб-приложение. Имя класса: org.apache.catalina.ant.InstallTask
ReloadTask Перезагрузите веб-приложение. Имя класса: org.apache.catalina.ant.ReloadTask
ListTask Список всех веб-приложений. Имя класса: org.apache.catalina.ant.ListTask
StartTask Запускает веб-приложение. Имя класса: org.apache.catalina.ant.StartTask
StopTask Останавливает веб-приложение. Имя класса: org.apache.catalina.ant.StopTask
ReloadTask Перезагружает веб-приложение без остановки. Имя класса: org.apache.catalina.ant.ReloadTask

Задача перезагрузки требует следующих дополнительных параметров:

  • URL-адрес приложения-менеджера
  • Имя пользователя для перезапуска веб-приложения
  • Пароль для перезапуска веб-приложения
  • Имя перезапускаемого веб-приложения

Давайте выпустим deploy-war, чтобы скопировать веб-приложение в папку веб-приложений Tomcat, а затем позвольте нам перезагрузить веб-приложение факса. Результатом запуска файла Ant является следующий результат:

C:\>ant deploy-war
Buildfile: C:\build.xml

BUILD SUCCESSFUL
Total time: 6.3 seconds

C:\>ant reload
Buildfile: C:\build.xml

BUILD SUCCESSFUL
Total time: 3.1 seconds

После выполнения вышеуказанной задачи веб-приложение развертывается, и веб-приложение перезагружается.

Вы можете использовать Ant для выполнения кода Java. В следующем примере класс java принимает аргумент (адрес электронной почты администратора) и отправляет электронное письмо.

public class NotifyAdministrator
{
   public static void main(String[] args)
   {
      String email = args[0];
      notifyAdministratorviaEmail(email);
      System.out.println("Administrator "+email+" has been notified");
   }
   public static void notifyAdministratorviaEmail(String email
   { 
	   //......
   }
}

Вот простая сборка, которая выполняет этот Java-класс.

<?xml version="1.0"?>
<project name="sample" basedir="." default="notify">
   <target name="notify">
      <java fork="true" failonerror="yes" classname="NotifyAdministrator">
         <arg line="[email protected]"/>
      </java>
   </target>
</project>

Когда сборка выполняется, она дает следующий результат:

C:\>ant
Buildfile: C:\build.xml

notify: [java] Administrator [email protected] has been notified

BUILD SUCCESSFUL
Total time: 1 second

В этом примере код java делает простую вещь - отправляет электронное письмо. Для этого мы могли бы использовать встроенную задачу Ant. Однако теперь, когда у вас есть идея, вы можете расширить свой файл сборки для вызова java-кода, который выполняет сложные вещи, например: шифрует ваш исходный код.

Если вы уже загрузили и установили Eclipse, вам почти нечего делать, чтобы начать работу. Eclipse поставляется в комплекте с плагином Ant, готовым к использованию.

Выполните простые шаги, чтобы интегрировать Ant в Eclipse.

  • Убедитесь, что build.xml является частью вашего java-проекта и не находится во внешнем по отношению к проекту месте.

  • Включите Ant View, выполнив следующие действия Window > Show View > Other > Ant > Ant.

  • Откройте Project Explorer, перетащите build.xml в Ant View.

Ваше представление Ant выглядит примерно так:

Щелчок по целям, сборка / очистка / использование запустит Ant с целью.

Нажатие «факс» выполнит цель по умолчанию - usage.

Плагин Ant Eclipse также поставляется с хорошим редактором для редактирования файлов build.xml. Редактор знает схему build.xml и может помочь вам с автозавершением кода.

Чтобы использовать редактор Ant, щелкните правой кнопкой мыши файл build.xml (в проводнике проекта) и выберите «Открыть с помощью> Редактор Ant». Редактор Ant должен выглядеть примерно так:

Редактор Ant перечисляет цели с правой стороны. Список целей служит закладкой, позволяющей сразу перейти к редактированию конкретной цели.

JUnit - это широко используемая среда модульного тестирования для разработки на основе Java. Его легко использовать и легко расширять. Доступен ряд расширений JUnit. Если вы не знакомы с JUnit, вам следует загрузить его с www.junit.org и прочитать руководство к нему.

В этой главе показано, как выполнять тесты JUnit с помощью Ant. Ant делает это прямо через задачу JUnit.

Атрибуты задачи JUnit представлены ниже:

Свойства Описание
реж Откуда вызывать виртуальную машину. Это игнорируется, когдаfork выключен.
jvm Команда, используемая для вызова JVM. Это игнорируется, когдаfork выключен.
вилка Запускает тест в отдельной JVM
ошибка Имя свойства, которое нужно установить, если есть ошибка JUnit.
отказ Имя свойства, устанавливаемого в случае сбоя JUnit.
Haltonerror Останавливает выполнение при возникновении ошибки теста
Haltonfailure Останавливает выполнение при сбое
принтсводка Советует Ant отображать простую статистику для каждого теста
Showoutput Советует Ant отправлять вывод в его журналы и средства форматирования
tempdir Путь к временному файлу, который будет использовать Ant
тайм-аут Завершает тесты, выполнение которых занимает больше времени, чем этот параметр (в миллисекундах).

Продолжим тему Hello World Отправьте факс через веб-приложение и добавьте цель JUnit.

В следующем примере показано простое выполнение теста JUnit:

<target name="unittest">
   <junit haltonfailure="true" printsummary="true">
      <test name="com.tutorialspoint.UtilsTest"/>
   </junit>
</target>

В этом примере показано выполнение JUnit в классе junit com.tutorialspoint.UtilsTest. Выполнение приведенного выше кода дает следующий результат:

test:
[echo] Testing the application
[junit] Running com.tutorialspoint.UtilsTest
[junit] Tests run: 12, Failures: 0, Errors: 0, Time elapsed: 16.2 sec
BUILD PASSED

Ant поставляется с предопределенным набором задач, однако вы можете создавать свои собственные задачи, как показано в примере ниже.

Пользовательские задачи Ant должны расширять org.apache.tools.ant.Taskclass и должен расширять метод execute (). Вот простой пример:

package com.tutorialspoint.ant;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
public class MyTask extends Task {
   String message;
   public void execute() throws BuildException {
      log("Message: " + message, Project.MSG_INFO);
   }
   public void setMessage(String message) {
      this.message= message;
   }
}

Чтобы выполнить настраиваемую задачу, вам необходимо добавить в Hello World Веб-приложение факса:

<target name="custom">
   <taskdef name="custom" classname="com.tutorialspoint.ant.MyTask" />
   <custom message="Hello World!"/>
</target>

При выполнении указанной выше настраиваемой задачи выводится сообщение «Hello World!».

c:\>ant custom
test:
[custom] Message : Hello World!
elapsed: 0.2 sec
BUILD PASSED

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

Распечатать