Tomcat app deployment using Ant

Рубрика: Development, Java | 18 March 2008, 22:18 | Vadim Voituk

В продолжение темы использования и полезности Ant расскажу как с помощью того же Ant развертывать приложение на удаленном Tomcat-сервере.

Не смотря на то, что возможность достаточно популярная, последний раз пользовался ею года так 2-3 назад, и чтоб заново реализовать deploy приложения с помощью Ant – прийшлось потратить достаточно много времени.
Это и стало причиной написания этой заметки, ибо где ещё проще всего найти что-то, чем в собственном блоге :)

Первым делом необходимо подключить дополнительные Ant-tasks для работы с Tomcat.
Для этого берем из дистрибутива Tomcat необходимые jar-файлы.
Для Tomcat 6.x этот список состоит из:
lib/catalina-ant.jar
lib/jasper.jar
lib/servlet-api.jar
bin/tomcat-juli.jar

Для Tomcat 5.x – необходим немного другой набор файлов:
server/lib/catalina-ant.jar
common/lib/jasper-compiler.jar
common/lib/jasper-runtime.jar
common/lib/servlet-api.jar
common/lib/commons-logging.jar

Дабы не привязываться к наличию Tomcat-дистрибутива, копируем эти файлы в локальную директорию.
Например: D:\Workspace\LIBS

Далее в своем build.xml пишем такое:

[xml]
<property name=”tomcat.libs.dir” location=”D:/workspace/_LIBS” />
<path id=”tomcat.classpath”>
<pathelement location=”${tomcat.libs.dir}/catalina-ant.jar” />
<pathelement location=”${tomcat.libs.dir}/servlet-api.jar” />
<pathelement location=”${tomcat.libs.dir}/jasper.jar” />
<pathelement location=”${tomcat.libs.dir}/tomcat-juli.jar” />
</path>
<taskdef resource=”org/apache/catalina/ant/catalina.tasks”
classpathref=”tomcat.classpath”/>
[/xml]
В результате было произведено подключение дополнительных Ant task-ов:
deploy, install, list, reload, remove, resources, roles, start, stop, undeploy

Очень удобно подключения этого списка вынести в отдельный файл и подключать из основного c помощью import.
Например:
[xml]<import file=”tomcat-tasks.xml”/>[/xml]

Нас интересуют первый и последний (deploy и undeploy).
Их использование выглядит таким образом:
[xml]
<deploy
url=”${tomcat.manager.url}”
username=”${tomcat.manager.user}”
password=”${tomcat.manager.password}”
path=”/${webapp.context}”
war=”file:${war.file}”
/>

<undeploy
url=”${tomcat.manager.url}”
username=”${tomcat.manager.user}”
password=”${tomcat.manager.password}”
path=”/${webapp.context}”
/>
[/xml]

Где
${tomcat.manager.url} – путь к Tomcat Manager App, например http://myserver.com:8080/manager
${tomcat.manager.user} и ${tomcat.manager.password} – реквизиты доступа для пользователя, который в указан в tomcat-users.xml с roles=”manager”
${webapp.context} – контекст приложения (URL), по которому оно будет доступно
${war.file} – путь к war-файлу приложения

Теперь не составит труда рализовать свои ant target-ы для развертывания и сворачивания (подругому undeploy не могу перевести) приложения на удаленный Tomcat.
Единственное что хочется сразу отметить, перед тем как выполнить deploy, необходимо приложение свернуть, тоесть выполнить undeploy, иначе task завершится с ошибкой.
Причем действительно и обратное утверждение.
В результате иногда наступает ситуация, когда во время очередного автоматического развертывания не известно установлено приложение или нет.
Для решения этой задачи я предпочитаю использовать такой трюк:
[xml]
<target name=”check-if-deployed” >
<condition property=”is.webapp.deployed”>
<http url=”${tomcat.root.url}/${webapp.context}” />
</condition>
</target>
[/xml]
и далее установить такие зависимости для deploy и undeploy target-ов:
[xml]
<target name=”deploy” depends=”undeploy” description=”…”>…</target>
<target name=”undeploy” depends=”check-if-deployed”
if=”is.webapp.deployed” description=”…”>…</target>
[/xml]

По-хорошему, надо бы использовать только что подключеный task list:
[xml]
<list
url=”${tomcat.manager.url}”
username=”${tomcat.manager.user}”
password=”${tomcat.manager.password}”
/>
[/xml]
который выводит результат в таком виде:
OK - Listed applications for virtual host localhost
/IPX:running:0:IPX
/examples:running:0:examples
/host-manager:running:0:host-manager
/docs:running:0:docs
/manager:running:0:manager
/:running:0:ROOT

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

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

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

6 Responses to “Tomcat app deployment using Ant”

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

  1. Pavel Vinogradov

    Спасибо, заметка действительно пригодилась.

    Делал для Tomcat 5.5, либа common/lib/commons-logging.jar не понадобилась.

  2. Василий

    Спасибо статья отличная,единственный вопрос по ключевому слову “Workspace” сделал предположение что в кечестве IDE используется Eclipse.
    Необходимые библиотеки, я бы предложил хранить в каталоге /lib самого ant.
    Это практичнее и нет необходимости ссылаться на конкретный workspace мало ли где он расположен.

  3. Анна

    Спасибо! Статья очень помогла. Делала для tomcat 6.0.26.

  4. Йа

    Пасиба :) Очень помогло)

  5. Anton

    Спасибо за полезную заметку.
    Правда у меня возникли проблемы с андеплоем. Дело в том, что при андеплое с сервера не удаляется папка проекта, которую сервер создал из war файла. Вернее не удаляется только mysql-connector-java-5.1.18-bin.jar и следовательно вся папка остается и получается, что при следующем деплое сервер не создаст папку из war файла, т.к. она уже есть. Я пробовал перед андеплоем делать stop, но все равно не выходит. И андеплой и стоп срабатывают нормально без ошибок. Подскажите плиз кто знает.

  6. Anton

Leave a Reply