barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 16 мая 2012 г.

Проект веб-приложения в Netbeans: автоматизация обновления из svn и развертывания на удаленном Tomcat 6

Задача:

Есть проект веб-приложения Java в Netbeans. Папка проекта находится по контролем версий. Необходимо в один-два клика из IDE выполнить обновление исходников проекта из svn, его очистку, сброку и развертывание на удаленном сервере Tomcat, отличном от того, который прописан в свойствах проекта как сервер для выполнения (там прописан локальный тестовый сервер, а разворачивать в автоматическом режиме нужно на боевом).

Решение:

Во-первых, чтобы не городить огород в виде лишних скриптов, было решено добавить новую цель в build.xml проекта. С моими скудными пока познанями в ant я немного побуксовал, но всё же добился поставленной цели.
Для обновления из svn можно использовать ant task (например, svntask), вот только последний отказался работать за проксёй с авторизацией даже после использование setproxy, поэтому я решил особенно не заморачиваться и вызывать с помощью задания exec клиент TortoiseSVN. Можно было бы конечно воспользоваться и консольным клиентом, но мне появляющееся GUI-окошко TortoiseSVN  при обновлении не помешало; даже наоборот, было удобнее видеть, что именно произошло при Update`е. В итоге ant-цель для обновления проекта из svn выглядела так:
<target description="Updates ${basedir} from svn repository using TortoiseSVN" name="tortoise-svn-update">
    <echo message="Updating from SVN using TortoiseSVN"/>
    <property name="tortoisesvn.home" value="C:\Program Files\TortoiseSVN\bin\"/>
    <exec executable="${tortoisesvn.home}\TortoiseProc.exe">
      <arg value="/command:update"/>
      <arg value="/path:${basedir}"/>    
    </exec>
</target>
Теперь осталось создать цель для развертывания проекта на удаленном сервере:
<target depends="tortoise-svn-update,clean,dist" description="Remote deployment" name="deploy-remote">
<property name="deployment.remote.server.url" value="http://mytomcathost:8080"/>
<property name="deployment.remote.server.manager.login" value="administrator"/>
<property name="deployment.remote.server.manager.password" value="xxx"/>
<property name="deployment.remote.context" value="mycontext"/>
<property name="war.file.name" value="${deployment.remote.context}"/>
<property name="tomcat.lib.path" value="C:/tomcat/lib/"/>
<echo message="Remote undeploying ${deployment.remote.context}"/>
<taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"
classpath="${tomcat.lib.path}catalina-ant.jar"/>
<undeploy url="${deployment.remote.server.url}/manager" username="${deployment.remote.server.manager.login}"
 password="${deployment.remote.server.manager.password}" path="/${deployment.remote.context}"/>

<echo message="Remote deploying ${basedir}/dist/${war.file.name}.war to /${deployment.remote.context}"/>
<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"
 classpath="${tomcat.lib.path}catalina-ant.jar"/>
<deploy url="${deployment.remote.server.url}/manager" username="${deployment.remote.server.manager.login}"
password="${deployment.remote.server.manager.password}" path="/${deployment.remote.context}"
war="${basedir}/dist/${war.file.name}.war"/>            
</target>
Здесь предполагается, что имя создаваемого при компиляции war-ника совпадает с контекстом, в котором разворачивается приложение на удаленном сервере (war.file.name =  deployment.remote.context), при необходимости это можно поменять. Путь к библиотекам томката нужно прописывать, чтобы ant взял оттуда библиотеку с заданиями для работы с томкатом.
Теперь, когда есть задание в build.xml, можно разместить его либо в меню NetBeans, либо на панели инструментов, либо назначить ему сочетание клавиш. Не очень универсальный подход конечно, т.к. получается что глобальное меню / панель / сочетание клавиш NB будет использоваться для задания одного проекта, но я пока не нашел как сделать так, чтобы команда меню / кнопка панели / сочетания клавиш вызывали цель из build.xml текущего проекта, а не по абсолютному пути к этому build.xml. Делается добавление пунктов меню / кнопок панели / сочетаний клавиш следующим образом:
  1. В обозревателе файлов NB открывается необходимый проект и выбирается его build.xml. 
  2. При этом на панели "Навигатор" отобразятся все ant-цели. Достаточно щелкнуть правой кнопкой мыши по нужной цели и выбрать "Создать сочетание клавиш":

В появившемся диалоге можно выбрать, что именно мы добавляем, пункт меню, кнопку панели или сочетание клавиш и задать необходимые параметры - и вуаля, мы получаем возможность в 1-2 клика сделать update и развертывание на удаленном сервере, как и хотели:


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

Отправить комментарий