Задача:
Есть проект веб-приложения 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. Делается добавление пунктов меню / кнопок панели / сочетаний клавиш следующим образом:
- В обозревателе файлов NB открывается необходимый проект и выбирается его build.xml.
- При этом на панели "Навигатор" отобразятся все ant-цели. Достаточно щелкнуть правой кнопкой мыши по нужной цели и выбрать "Создать сочетание клавиш":
Комментариев нет:
Отправить комментарий