Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ant, заметка для FAQ 
:(
    Опции темы
batigoal
Дата 12.9.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



В течение долгого времени мне хватало для сборки приложения волшебной кнопочки «Build» с зеленой стрелочкой. Однако, по мере роста задач, она перестала удовлетворять моим нуждам, и я обратил свое внимание на утилиту ant. И вот что из этого получилось...


Цели

Имеем следующую ситуацию. Приложение крутится на сервере Sun под управлением OC Solaris. Для внесения изменений в какой-либо из классов необходимо произвести следующие действия:
  • Скорректировать исходный код класса (на своем компьютере).
  • Откомпилировать его (на своем компьютере).
  • Создать JAR-архив с новой версией класса (на своем компьютере).
  • Откомпилировать JSP-страницу.
  • Остановить работу приложения (которое крутится на сервере под связкой Apache + Resin).
  • Заменить лежащий там JAR-файл на свою версию (используя FTP), скопировать обновленную страницу.
  • Стартовать приложение.
Кроме того, по возможности хотелось выполнить SQL-запрос к базе Oracle, чтобы вычистить оттуда тестовые данные, оставшиеся там в результате работы приложения.

Разумеется, выполнять все эти действия вручную – занятие утомительное. Очень хочется выполнять всю последовательность одним кликом или одной командой. Тогда я вспомнил про Ant. Покопавшись в информации по нему, я с удивлением узнал, что он может выполнить и эти операции, и множество других заданий.


Hello, world

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

Код

<project>
  <target name="clean">
        <delete dir="build"/>
    </target>
</project>


project – это корневой тег. Он обязательно должен присутствовать в файле build.xml. Он содержит энное количество тегов <target>, каждый из которых определяет одно задание. Каждое задание должно иметь уникальное (в пределах файла) имя. И, наконец, delete – конкретное действие, выполняющееся при запуске задания. В данном случае это удаление каталога build, находящегося в текущем каталоге.

Запуск

Запустить ant с этим файлом можно командой
ant -buildfile build.xml clean
Соответственно, в данном случае опция –buildfile указывает, что после нее будет идти имя xml-файла. clean – имя запускаемого задания.

Кроме того, существует опция –lib. Она нужна, чтобы подключать к антовскому classpath’у дополнительные библиотеки и классы.


Второй шаг

Расширим наш файл дополнительными параметрами:

Код

<project name="My Project Buildfile" default="clean" basedir=".">
  <property name="build.dir" value="build"/>
  <target name="clean" description="Removes all generated files">
    <delete dir="${build.dir}"/>
  </target>
</project>


Тег project. name – имя проекта. default – имя того задания, которое будет запускаться по умолчанию, если не будет указан конкретный таск. basedir – директория, которая будет считаться корневой при сборке, все пути будут указываться относительно нее. Все три параметра являются необязательными, их можно безболезненно опустить.

Тег property. Этот тег позволяет нам объявить поле с каким-либо значением, и использовать его затем по всему скрипту. Соответственно, если впоследствии нам нужно будет поменять это значение, это нужно будет делать в одном месте, а не во всем коде. name – название переменной, value – ее значение. Теперь мы можем использовать такую конструкцию: ${build.dir}, вместо нее будет подставлено значение «build».

К тегу target мы добавили атрибут description. Никакой смысловой нагрузки он не несет, просто дополнительное описание.


Поехали дальше. Сделаем несколько типовых тасков, а потом соберем их в итоговый документ. Некоторые задания требуют использования дополнительных библиотек. Но сначала определим свойства, которые мы будем использовать по ходу дальнейшей работы:

Код

<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="build.classes" value="${build.dir}/classes"/>
<property name="lib" value="D:/projects/libs"/>


src.dir – каталог исходных java-файлов
build.dir – каталог для результатов компиляции и упаковки
build.classes – class-файлы
lib – каталог для сторонних библиотек. Здесь я использовал абсолютный путь, т.к. у меня один каталог на несколько проектов.


Создание новой директории

Код

    <target name="prepare">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
    </target> 


Новая директория создается тегом mkdir. Как мы видим из этого примера, задание может содержать несколько директив.


Компиляция

Код

    <target name="compile" depends="prepare" description="Compiles all source code">
        <javac srcdir="${src.dir}" destdir="${build.classes}">
            <classpath>
                <pathelement location="."/>
                <pathelement location="${lib}/ojdbc14.jar"/>
                <pathelement location="${lib}/j2ee.jar"/>
                <pathelement location="${lib}/utils.jar"/>
                <pathelement location="${lib}/context.jar"/>
                <pathelement location="${lib}/signon.jar"/>
            </classpath>
        </javac>
    </target> 


Вот тут в теге target впервые появляется очень важный атрибут – depends. Запись depends="prepare" означает, что при запуске этого задания будет предварительно выполнено задание prepare. Если необходимо выполнить несколько тасков, они перечисляются через запятую, и выполняются в том порядке, в котором они указаны.

Тег javac, как нетрудно догадаться, выполняет компиляцию java-файлов. Атрибутами srcdir и destdir мы указываем каталоги исходных и скомпилированных файлов. Для указания classpath существует одноименный тег, каждый элемент пути указывается отдельным тегом pathelement с атрибутом location.


Упаковка в JAR-архив

Код

    <target name="jar" depends="compile" description="Generates the result JAR-archive">
        <jar jarfile="${build.dir}/tvspace.jar"
             basedir="${build.classes}">
            <metainf file="tvspace.tld"/>
          </jar>
    </target> 


Здесь мы сначала указываем, что упаковке должна предшествовать компиляция. Затем осуществляем архивацию с помощью тега jar. jarfile – имя архива, basedir – каталог, который мы будем паковать, metainf – тег для указания дополнительных файлов, которые мы желаем включить в папку META-INF.


Компиляция JSP

Код

    <target name="compileJSP">
        <jspc srcdir="."
              destdir="${build.dir}"
              package="_tvspace"
              compiler="jasper41">
            <include name="**/*.jsp"/>
        </jspc>
    </target> 


(необходимы библиотеки jasper.jar и jasper-runtime.jar)

Компиляция JSP-страниц выполняется с помощью задания jspc. Указывается исходная директория (srcdir), конечная директория (destdir), пакет (package), компилятор jasper (package). Директива include name="**/*.jsp" указывает, что должны быть откомпилированы все файлы с расширением .jsp, находящиеся в исходной директории.


Работа с FTP

Код

    <target name="ftp" description="Uploads file to FTP">
        <ftp action="put"
             server="appserver.lab.ru"
             userid="my_user"
             password="my_user"
             remotedir="/export/home/my_user/lib">
            <fileset dir="${build.dir}">
                <include name="tvspace.jar"/>
            </fileset>
        </ftp>
    </target> 


(необходима библиотека commons-net-1.4.0.jar)

Как всегда, все очевидно следует из имен и названий smile

Тег ftp. Атрибуты:
action – команда сервера. В данном случае мы делаем закачку на сервер, поэтому put.
server – имя удаленного сервера
userid – имя пользователя
password – пароль
remotedir – директория, в которую будет производиться аплоад.

Тег fileset используется в очень многих директивах ant. Он позволяет определить набор файлов, в т.ч. с использованием маски имени. В данном случае мы просто включаем туда конкретный файл директивой include. То есть, при запуске этого задания будет произведено копирование файла tvspace.jar в директорию /export/home/my_user/lib от имени пользователя my_user (разумеется, в случае правильной авторизации).

Запуск shell-скрипта

Код

    <target name="stop" description="Stops server">
        <sshexec host="my_host.lab.ru" trust="yes"
            username="my_user"
            password="my_user"
            command="/export/home/my_user/myscript stop"/>
    </target> 


(необходима библиотека jsch-0.1.21.jar)

Запуск shell-скрипта можно осуществить с помощью тега sshexec. Этот тег отвечает за открытие SSH-соединения с удаленным сервером.
host – имя удаленного сервера.
trust – этот параметр показывает, «доверяет» ли сервер неизвестным хостам. Я с ним так до конца и не разобрался, но без этого не работало smile
username – имя пользователя
password – пароль
command – директория, в которую будет производиться аплоад.


Работа с БД

Код

    <target name="deleteRecordFromDB" description="The SQL-script for clearing the added records">
        <sql driver="oracle.jdbc.OracleDriver"
                url="jdbc:oracle:thin:@mydbhost:1521:mydbsid"
                userid="my_user"
                password="my_user">
           delete from test_table
        </sql>
    </target> 


(для запуска необходимо подключить библиотеку ojdbc14.jar)

Вновь все очевидно. Формат параметров соответствует обычной JDBCшной нотации. Тег sql имеет атрибуты driver (JDBC-драйвер для базы), url (URL, по которому доступна база), userid (имя пользователя) и password (пароль). Кроме того, можно еще использовать атрибут src и указать sql-файл с выполняемым скриптом (sql=”my_script_file.sql”). Но я делаю это прямо в теле тега, как показано выше.



Итог

Все задания описаны. Теперь мы можем написать, например, такой таск:
Код

<target name="all" depends="stop, compile, jar, ftp, start" 
  description="Cleans, compiles, builds the JAR file, puts it on the server and restarts it"/> 

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


Вся справочная информация получена из официального мануала, который можно найти по адресу http://ant.apache.org/manual/index.html. На официальном сайте ant (http://ant.apache.org) можно найти описания форматов всевозможных заданий, как базовых, так и сторонних. Возможности ant поистине огромны, и все это – при такой простоте управления! Кроме того, мы сохраняем преимущество кроссплатформенности и отвязываемся от среды-сборщика. Кстати, ant отлично интегрируется с современными IDE.




P.S. Большая просьба ко всем, кто работал с ant из командной строки. Я пробовал все это из-под IDE (Idea & Eclipse), с командной строкой у меня не срослось. PATH, CLASSPATH и ANT_HOME прописан, но получаю такую же ошибку командной строки, как если бы виртуальная машина была запущена с неправильными параметрами. Может, кто-нибудь может что-то посоветовать?

Это сообщение отредактировал(а) Lamer George - 12.9.2005, 16:20


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
allex
Дата 12.9.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 5.9.2005

Репутация: нет
Всего: нет



Командную строку и сообщение об ошибке в студию!
PM MAIL   Вверх
batigoal
Дата 12.9.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



Строка проста, как валенок. Пользовал несколько вариантов:
ant
ant -buildfile build.xml
ant stop
ant -buildfile build.xml stop

А ошибка такая же, какую выдает команда java без параметров:


Присоединённый файл ( Кол-во скачиваний: 70 )
Присоединённый файл  java.JPG 53,43 Kb


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
аЛексус
Дата 20.3.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Кто нить подскажите где можно достать мануал по ANT на русском?! ПЛИЗ!
PM MAIL WWW ICQ   Вверх
batigoal
Дата 20.3.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151





--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
аЛексус
Дата 20.3.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Thanx!
PM MAIL WWW ICQ   Вверх
аЛексус
Дата 21.3.2006, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Кстати, разобрался с той ошибкой?
У меня есть еще один вопрос!
В общем ситуация такая: у меня есть база данных со всеми хранимками и процедурами, но некоторорые хранимки и процедуры надо регулярно обновлять из CVS. Сейчас это все приходится делать в ручную, но как известно лень! Есть предложение сделать это с помощью ANT. У кого-нибудь есть соображения как?
PM MAIL WWW ICQ   Вверх
tux
Дата 21.3.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Цитата(аЛексус @ 21.3.2006, 11:47 Найти цитируемый пост)
В общем ситуация такая: у меня есть база данных со всеми хранимками и процедурами, но некоторорые хранимки и процедуры надо регулярно обновлять из CVS. Сейчас это все приходится делать в ручную, но как известно лень! Есть предложение сделать это с помощью ANT. У кого-нибудь есть соображения как?

Да проще простого. Получится что-то такое:
Код

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="Application">

    <target name="init">
        <property environment="env" />
        <property name="ws.dir" value="./ws" />
        <property name="cvs.root" value=":pserver:[email protected]:/home/cvs" />
        <property name="lib.dir" value="lib" />
        <property name="db.driver" value="org.postgresql.Driver"/>
        <property name="db.url" value="jdbc:postgresql://localhost/database"/>
        <property name="db.user" value="postgres"/>
        <property name="db.password" value=""/>
        
        <path id="class.path">
            <fileset dir="${lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </path>
    </target>

    <target name="cvs" depends="init">
        <cvspass cvsroot="${cvs.root}" password="1234567" />
        <cvs cvsRoot="${cvs.root}" package="application" dest="${ws.dir}" />
    </target>

    <target name="db" depends="cvs">
        <sql driver="${db.driver}" 
            url="${db.url}" 
            userid="postgres" 
            password="${db.password}" 
            src="${ws.dir}/application/src/test/hibernate/db.sql" 
            classpathref="class.path"/>
    </target>

    <target name="all" depends="db">
    </target>

</project>

Заменяешь свойства db.* и название скрипта sql на то, что тебе нужно и все должно работать. Естественно, если у тебя несколько скриптов, выполняешь тэг <sql> для каждого.
PM MAIL Skype GTalk Jabber YIM   Вверх
batigoal
Дата 21.3.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



Цитата(tux @ 21.3.2006, 10:14 Найти цитируемый пост)
Естественно, если у тебя несколько скриптов, выполняешь тэг <sql> для каждого.

А разве скопом нельзя? В мануле есть такие примеры:
Код

<sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass">
  <fileset dir=".">
    <include name="data*.sql"/>
  </fileset>
  <transaction>
    truncate table some_other_table;
  </transaction>
</sql>


Или просто
Код

<sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass" >
  <transaction  src="data1.sql"/>
  <transaction  src="data2.sql"/>
  <transaction  src="data3.sql"/>
  <transaction>
    truncate table some_other_table;
  </transaction>
</sql>

Добавлено @ 09:30
Цитата(аЛексус @ 21.3.2006, 07:47 Найти цитируемый пост)
Кстати, разобрался с той ошибкой?

Все заработало, но почему - не знаю smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
tux
Дата 21.3.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Цитата(Lamer George @ 21.3.2006, 14:28 Найти цитируемый пост)
А разве скопом нельзя?

Можно конечно smile Просто скрипт брал из своего готового.
PM MAIL Skype GTalk Jabber YIM   Вверх
аЛексус
Дата 21.3.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Спасибо, попробую! Мне кажется удобней делать через fileset потому что скриптов много! Да и еще, не подскажите где взять драйвер для MS SQL Server 2000?! я просто недавно этим занимаюсь, поэтому не знаю где что! smile
PM MAIL WWW ICQ   Вверх
tux
Дата 21.3.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Здесь драйвер от самой Microsoft - http://msdn.microsoft.com/data/jdbc/default.aspx. Здесь драйвер стороннего производства, open-source - http://jtds.sourceforge.net/. Судя по рассказам второй работает лучше, сам не пользовался.
PM MAIL Skype GTalk Jabber YIM   Вверх
vaz
Дата 5.4.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



To Lamer George по поводу ошибки "А ошибка такая же, какую выдает команда java без параметров".
Посмотри не установлен ли у тебя ант в каталог, содержащий пробелы. Например, D:\Program files\Ant. Ант не работает с путями, содержащими пробелы.

И еще очень насущный вопрос: С помощью <javac> таска можно компилить исходные файлы проекта. А как получить имена только компилируемых исходников? Насколько я понял ант компилит не все исходники подряд, а только измененные исходники. Или как дополнительно обработать исходник с помощью другой программы непосредственно в ходе компиляции с помощью таска <javac>. То есть нужно обрабатывать другой программой только измененные исходники, которые определил ант.
PM MAIL   Вверх
batigoal
Дата 5.4.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



Цитата(vaz @ 5.4.2006, 14:13 Найти цитируемый пост)
To Lamer George по поводу ошибки "А ошибка такая же, какую выдает команда java без параметров".
Посмотри не установлен ли у тебя ант в каталог, содержащий пробелы. Например, D:\Program files\Ant. Ант не работает с путями, содержащими пробелы.

А он заработал уже давно. Я так и не понял, в чем было дело.

Цитата(vaz @ 5.4.2006, 14:13 Найти цитируемый пост)
И еще очень насущный вопрос: С помощью <javac> таска можно компилить исходные файлы проекта. А как получить имена только компилируемых исходников? Насколько я понял ант компилит не все исходники подряд, а только измененные исходники. Или как дополнительно обработать исходник с помощью другой программы непосредственно в ходе компиляции с помощью таска <javac>. То есть нужно обрабатывать другой программой только измененные исходники, которые определил ант.

А ты уверен, что он компилит только измененные? Ведь Ant даже отследить этого не может - никакой иcтории изменений не ведется.

Это сообщение отредактировал(а) Lamer George - 5.4.2006, 14:33


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
jer1
Дата 5.4.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: нет
Всего: 5



Цитата(Lamer George @ 5.4.2006, 14:30)
А ты уверен, что он компилит только измененные? Ведь Ant даже отследить этого не может - никакой иcтории изменений не ведется.

ant/docs/manual/CoreTasks/javac.html


Javac
Description

Compiles a Java source tree.

The source and destination directory will be recursively scanned for Java source files to compile. Only Java files that have no corresponding .class file or where the class file is older than the .java file will be compiled. // выделено мною jer1


--------------------
:w!q
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java tools & IDE's | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.