![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
batigoal |
|
||||||||||||||||||||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 11 Всего: 151 |
В течение долгого времени мне хватало для сборки приложения волшебной кнопочки «Build» с зеленой стрелочкой. Однако, по мере роста задач, она перестала удовлетворять моим нуждам, и я обратил свое внимание на утилиту ant. И вот что из этого получилось...
Цели Имеем следующую ситуацию. Приложение крутится на сервере Sun под управлением OC Solaris. Для внесения изменений в какой-либо из классов необходимо произвести следующие действия:
Разумеется, выполнять все эти действия вручную – занятие утомительное. Очень хочется выполнять всю последовательность одним кликом или одной командой. Тогда я вспомнил про Ant. Покопавшись в информации по нему, я с удивлением узнал, что он может выполнить и эти операции, и множество других заданий. Hello, world Начнем с начала. Ant представляет из себя утилиту, предназначенную для построения готовой build-версии приложения. Работа утилиты определяется XML-документом, состоящим из отдельных заданий (tasks). Обычно этот файл называется build.xml. Пример простейшего файла build.xml:
project – это корневой тег. Он обязательно должен присутствовать в файле build.xml. Он содержит энное количество тегов <target>, каждый из которых определяет одно задание. Каждое задание должно иметь уникальное (в пределах файла) имя. И, наконец, delete – конкретное действие, выполняющееся при запуске задания. В данном случае это удаление каталога build, находящегося в текущем каталоге. Запуск Запустить ant с этим файлом можно командой ant -buildfile build.xml clean Соответственно, в данном случае опция –buildfile указывает, что после нее будет идти имя xml-файла. clean – имя запускаемого задания. Кроме того, существует опция –lib. Она нужна, чтобы подключать к антовскому classpath’у дополнительные библиотеки и классы. Второй шаг Расширим наш файл дополнительными параметрами:
Тег project. name – имя проекта. default – имя того задания, которое будет запускаться по умолчанию, если не будет указан конкретный таск. basedir – директория, которая будет считаться корневой при сборке, все пути будут указываться относительно нее. Все три параметра являются необязательными, их можно безболезненно опустить. Тег property. Этот тег позволяет нам объявить поле с каким-либо значением, и использовать его затем по всему скрипту. Соответственно, если впоследствии нам нужно будет поменять это значение, это нужно будет делать в одном месте, а не во всем коде. name – название переменной, value – ее значение. Теперь мы можем использовать такую конструкцию: ${build.dir}, вместо нее будет подставлено значение «build». К тегу target мы добавили атрибут description. Никакой смысловой нагрузки он не несет, просто дополнительное описание. Поехали дальше. Сделаем несколько типовых тасков, а потом соберем их в итоговый документ. Некоторые задания требуют использования дополнительных библиотек. Но сначала определим свойства, которые мы будем использовать по ходу дальнейшей работы:
src.dir – каталог исходных java-файлов build.dir – каталог для результатов компиляции и упаковки build.classes – class-файлы lib – каталог для сторонних библиотек. Здесь я использовал абсолютный путь, т.к. у меня один каталог на несколько проектов. Создание новой директории
Новая директория создается тегом mkdir. Как мы видим из этого примера, задание может содержать несколько директив. Компиляция
Вот тут в теге target впервые появляется очень важный атрибут – depends. Запись depends="prepare" означает, что при запуске этого задания будет предварительно выполнено задание prepare. Если необходимо выполнить несколько тасков, они перечисляются через запятую, и выполняются в том порядке, в котором они указаны. Тег javac, как нетрудно догадаться, выполняет компиляцию java-файлов. Атрибутами srcdir и destdir мы указываем каталоги исходных и скомпилированных файлов. Для указания classpath существует одноименный тег, каждый элемент пути указывается отдельным тегом pathelement с атрибутом location. Упаковка в JAR-архив
Здесь мы сначала указываем, что упаковке должна предшествовать компиляция. Затем осуществляем архивацию с помощью тега jar. jarfile – имя архива, basedir – каталог, который мы будем паковать, metainf – тег для указания дополнительных файлов, которые мы желаем включить в папку META-INF. Компиляция JSP
(необходимы библиотеки jasper.jar и jasper-runtime.jar) Компиляция JSP-страниц выполняется с помощью задания jspc. Указывается исходная директория (srcdir), конечная директория (destdir), пакет (package), компилятор jasper (package). Директива include name="**/*.jsp" указывает, что должны быть откомпилированы все файлы с расширением .jsp, находящиеся в исходной директории. Работа с FTP
(необходима библиотека commons-net-1.4.0.jar) Как всегда, все очевидно следует из имен и названий ![]() Тег ftp. Атрибуты: action – команда сервера. В данном случае мы делаем закачку на сервер, поэтому put. server – имя удаленного сервера userid – имя пользователя password – пароль remotedir – директория, в которую будет производиться аплоад. Тег fileset используется в очень многих директивах ant. Он позволяет определить набор файлов, в т.ч. с использованием маски имени. В данном случае мы просто включаем туда конкретный файл директивой include. То есть, при запуске этого задания будет произведено копирование файла tvspace.jar в директорию /export/home/my_user/lib от имени пользователя my_user (разумеется, в случае правильной авторизации). Запуск shell-скрипта
(необходима библиотека jsch-0.1.21.jar) Запуск shell-скрипта можно осуществить с помощью тега sshexec. Этот тег отвечает за открытие SSH-соединения с удаленным сервером. host – имя удаленного сервера. trust – этот параметр показывает, «доверяет» ли сервер неизвестным хостам. Я с ним так до конца и не разобрался, но без этого не работало ![]() username – имя пользователя password – пароль command – директория, в которую будет производиться аплоад. Работа с БД
(для запуска необходимо подключить библиотеку ojdbc14.jar) Вновь все очевидно. Формат параметров соответствует обычной JDBCшной нотации. Тег sql имеет атрибуты driver (JDBC-драйвер для базы), url (URL, по которому доступна база), userid (имя пользователя) и password (пароль). Кроме того, можно еще использовать атрибут src и указать sql-файл с выполняемым скриптом (sql=”my_script_file.sql”). Но я делаю это прямо в теле тега, как показано выше. Итог Все задания описаны. Теперь мы можем написать, например, такой таск:
и получим задание, позволяющее одной-единственной командой выполнить достаточно разноплановую последовательность действий. Вся справочная информация получена из официального мануала, который можно найти по адресу 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 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||||||||||||||||||||
|
|||||||||||||||||||||||
allex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 5.9.2005 Репутация: нет Всего: нет |
Командную строку и сообщение об ошибке в студию!
|
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 11 Всего: 151 |
Строка проста, как валенок. Пользовал несколько вариантов:
ant ant -buildfile build.xml ant stop ant -buildfile build.xml stop А ошибка такая же, какую выдает команда java без параметров: Присоединённый файл ( Кол-во скачиваний: 70 ) ![]() -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
аЛексус |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 20.3.2006 Где: Алматы Репутация: 1 Всего: 1 |
Кто нить подскажите где можно достать мануал по ANT на русском?! ПЛИЗ!
|
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 11 Всего: 151 |
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
аЛексус |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 20.3.2006 Где: Алматы Репутация: 1 Всего: 1 |
Thanx!
|
|||
|
||||
аЛексус |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 20.3.2006 Где: Алматы Репутация: 1 Всего: 1 |
Кстати, разобрался с той ошибкой?
У меня есть еще один вопрос! В общем ситуация такая: у меня есть база данных со всеми хранимками и процедурами, но некоторорые хранимки и процедуры надо регулярно обновлять из CVS. Сейчас это все приходится делать в ручную, но как известно лень! Есть предложение сделать это с помощью ANT. У кого-нибудь есть соображения как? |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 11 Всего: 132 |
Да проще простого. Получится что-то такое:
Заменяешь свойства db.* и название скрипта sql на то, что тебе нужно и все должно работать. Естественно, если у тебя несколько скриптов, выполняешь тэг <sql> для каждого. |
|||
|
||||
batigoal |
|
||||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 11 Всего: 151 |
А разве скопом нельзя? В мануле есть такие примеры:
Или просто
Добавлено @ 09:30 Все заработало, но почему - не знаю ![]() -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||||
|
|||||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 11 Всего: 132 |
||||
|
||||
аЛексус |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 20.3.2006 Где: Алматы Репутация: 1 Всего: 1 |
Спасибо, попробую! Мне кажется удобней делать через fileset потому что скриптов много! Да и еще, не подскажите где взять драйвер для MS SQL Server 2000?! я просто недавно этим занимаюсь, поэтому не знаю где что!
![]() |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 11 Всего: 132 |
Здесь драйвер от самой Microsoft - http://msdn.microsoft.com/data/jdbc/default.aspx. Здесь драйвер стороннего производства, open-source - http://jtds.sourceforge.net/. Судя по рассказам второй работает лучше, сам не пользовался.
|
|||
|
||||
vaz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
To Lamer George по поводу ошибки "А ошибка такая же, какую выдает команда java без параметров".
Посмотри не установлен ли у тебя ант в каталог, содержащий пробелы. Например, D:\Program files\Ant. Ант не работает с путями, содержащими пробелы. И еще очень насущный вопрос: С помощью <javac> таска можно компилить исходные файлы проекта. А как получить имена только компилируемых исходников? Насколько я понял ант компилит не все исходники подряд, а только измененные исходники. Или как дополнительно обработать исходник с помощью другой программы непосредственно в ходе компиляции с помощью таска <javac>. То есть нужно обрабатывать другой программой только измененные исходники, которые определил ант. |
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 11 Всего: 151 |
А он заработал уже давно. Я так и не понял, в чем было дело. А ты уверен, что он компилит только измененные? Ведь Ant даже отследить этого не может - никакой иcтории изменений не ведется. Это сообщение отредактировал(а) Lamer George - 5.4.2006, 14:33 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
jer1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 24.1.2005 Где: Харьков Украина Репутация: нет Всего: 5 |
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 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java tools & IDE's | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |