vladislav ant addendum

This commit is contained in:
Ivan I. Ovchinnikov 2022-09-05 22:53:46 +03:00
parent 51d3549ea6
commit bd35114bf7
1 changed files with 91 additions and 9 deletions

View File

@ -141,18 +141,97 @@ hello:
BUILD SUCCESSFULL
\end{verbatim}
Система сборки нашла файл сценария с именем по умолчанию (\code{build.xml}) и выполнила цель указанную по умолчанию (\code{hello}). В стандартной поставке Ant присутствует более 100 заранее созданных заданий, таких как: удаление файлов и директорий (\code{delete}), компиляция java-кода (\code{javac}), вывод сообщений в консоль (\code{echo}) и т.д. Пример реализации удаления временных файлов, используя задание delete
Система сборки нашла файл сценария с именем по умолчанию (\code{build.xml}) и выполнила цель указанную по умолчанию (\code{hello}). В стандартной поставке Ant присутствует более 100 заранее созданных заданий, таких как: удаление файлов и директорий (\code{delete}), компиляция java-кода (\code{javac}), вывод сообщений в консоль (\code{echo}) и т.д.
% --- слайд
\begin{lstlisting}[language=XML,style=ASMStyle]
<!-- Очистка -->
<target name="clean" description="Removes all temporary files">
<!-- Удаление файлов -->
<delete dir="${build.classes}"/>
</target>
Ниже будет представлен пример build-файла, а в качестве проекта для сборки возьмём из прошлого урока с двумя классами. Файл для него будет выглядеть следующим образом:
В случае, если у вас не сохранился проект с первого урока, то создайте структуру как на рис. \hrf{pic:simple-tree}.
После чего, можно приступить к написанию билд-файла, который будет находиться в корне проекта (на одном уровне с out и src). Выглядеть он будет следующим образом:
\begin{lstlisting}[language=XML,style=CCodeStyle]
<?xml version="1.0"?>
<project name="Sample" default="run">
<property name="src.dir" value="src/ru/gb/jcore" />
<property name="build.dir" value="out" />
<property name="classes.dir" value="${build.dir}/classes" />
<property name="jar.dir" value="${build.dir}/jar" />
<property name="main-class" value="ru.gb.jcore.sample.Main" />
<path id="classpath">
<fileset dir="${jar.dir}">
<include name="*.jar" />
</fileset>
<fileset dir="${classes.dir}">
<include name="/*.class" />
</fileset>
</path>
<target name="clean">
<delete dir="${classes.dir}" />
</target>
<target name="compile">
<mkdir dir="${classes.dir}" />
<mkdir dir="${jar.dir}" />
<javac destdir="${classes.dir}" includeAntRuntime="false">
<src path="${src.dir}/regular"/>
<src path="${src.dir}/sample"/>
<classpath refid="classpath" />
</javac>
</target>
<target name="jar" depends="compile">
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="${jar.dir}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java classname="${main-class}">
<classpath refid="classpath" />
</java>
</target>
<target name="clean-build" depends="clean,jar" />
<target name="main" depends="clean,run" />
</project>
\end{lstlisting}
% --- конец слайда
Теперь по порядку, что есть что.
Первым делом мы встречаем тег xml, в котором указывается его версия, а затем тег project с указанием имени проекта и команды по умолчанию.
После, в build-файле можно заметить тег property, который по своей натуре является переменной, чтобы сократить те или иные пути до папок/файлоы. Первая переменная с идентификатором (именем) src.dir имеет значение, которое ведёт до пакетов с файлами .java. Затем build.dir, которая обозначает папку, куда будут помещаться файлы после компиляции. classes.dir - путь до папок со сгенерированными файлами .class. jar.dir - директория с бинарными файлами. main-class - это местоположение главного класса приложения, чтобы потом указать .jar-файлу точку входа.
Наш сценарий содержит шесть target (команд):
\begin{enumerate}
\item Clean - удаляет папки с результатами компиляции;
\item Compile - создаёт две директории, одна для компиляции файлов .java, другая для создания .jar файла, а также указывается какой из двух классов куда будет скомпилирован;
\item Jar - она имеет свойство depends, что означает зависимость от указанной команды, а в нашем случае это команда compile, т.е. вначале выполнится compile, после чего команда jar. В подтеге jar присутствует настройка манифеста, там указывается путь до главного класса, в качестве входа в программу, а также местоположение бинарного файла;
\item Run - зависит от команды jar и является командой по умолчанию для проекта;
\item Clean-build - зависит от команд clean и jar. По своей сути, она выполняет просто эти две команды;
\item Main - выполняет команды clean и run.
\end{enumerate}
Также, имеется тег path - в нашем случае он указывает где и какие файлы будут находиться после компиляции.
После чего, можно выполнить команду ant run, а вывод будет следующим:
\begin{verbatim}
Buildfile: D:\Desktop\Java\GB\Sample\build.xml
compile:
[javac] Compiling 2 source files to D:\Desktop\Java\GB\Sample\out\classes
jar:
[jar] Building jar: D:\Desktop\Java\GB\Sample\out\jar\Sample.jar
run:
[java] Hello, world!
[java] Here is your number: 4.
BUILD SUCCESSFUL
Total time: 0 seconds
\end{verbatim}
\subsection{Репозитории, артефакты, конфигурации}
\subsection{Классический подход (Maven)}
@ -163,6 +242,9 @@ BUILD SUCCESSFULL
Ant, Ant+Ivy
На данный момент Ant используют в связке с Ivy, которая является гибким, настраиваемым инструментом для управления (записи, отслеживания, разрешения и отчетности) зависимостями Java проекта.
Первым для автоматизации этих задач появился Ant. Это аналог make-файла, а по сути набор скриптов (которые называются tasks). В отличие от make, утилита Ant полностью независима от платформы, требуется лишь наличие на применяемой системе установленной рабочей среды Java — JRE. Отказ от использования команд операционной системы и формат XML обеспечивают переносимость сценариев.
Управление процессом сборки происходит посредством XML-сценария, также называемого Build-файлом. В первую очередь этот файл содержит определение проекта, состоящего из отдельных целей (Targets). Цели сравнимы с процедурами в языках программирования и содержат вызовы команд-заданий (Tasks). Каждое задание представляет собой неделимую, атомарную команду, выполняющую некоторое элементарное действие.
Между целями могут быть определены зависимости — каждая цель выполняется только после того, как выполнены все цели, от которых она зависит (если они уже были выполнены ранее, повторного выполнения не производится). Типичными примерами целей являются clean (удаление промежуточных файлов), compile (компиляция всех классов), deploy (развёртывание приложения на сервере).