#java #apache #tomcat #deployment #ant
#java #apache #tomcat #развертывание #ant
Вопрос:
Я использую Apache Ant 1.8 для развертывания веб-приложения на локальном сервере Tomcat, и build.xml файл (ниже) дает желаемый эффект, когда я запускаю ‘ant deploy’ в командной строке.
Мой вопрос в том, что я заметил, что .файл war помещается туда, где я его ожидаю (deploy.dir определен в файле build.properties моего домашнего каталога), но он также неожиданно распаковал .war и извлек сам контекст в тот же каталог. Где в приведенном ниже build.xml файл для этого настроен?
<target name='init'>
<property file='${user.home}/build.properties'/>
<property name='app.name' value='${ant.project.name}'/>
<property name='src.dir' location='src'/>
<property name='lib.dir' location='lib'/>
<property name='build.dir' location='build'/>
<property name='classes.dir' location='${build.dir}/classes'/>
<property name='dist.dir' location='${build.dir}/dist'/>
</target>
<target name='initdirs' depends='init'>
<mkdir dir='${classes.dir}'/>
<mkdir dir='${dist.dir}'/>
</target>
<target name='compile' depends='initdirs'>
<javac srcdir='${src.dir}/java' destdir='${classes.dir}'>
<!--
<classpath>
<fileset dir='${lib.dir}/development' includes='javaee.jar'/>
<fileset dir='${lib.dir}/production' includes='jr.jar'/>
</classpath>
-->
</javac>
</target>
<target name='war' depends='compile'>
<war destFile='${dist.dir}/${app.name}.war' webxml='${src.dir}/web/WEB-INF/web.xml'>
<classes dir='${classes.dir}'/>
<!--
<zipfileset dir='${lib.dir}/production' includes='jr.jar' prefix='WEB-INF/lib' />
-->
<fileset dir='${src.dir}/web' excludes='WEB-INF/web.xml' />
</war>
</target>
<target name='build' depends='war' description='compile and create the war' />
<target name='clean' depends='init' description='Use for a clean build'>
<delete dir='${build.dir}' />
</target>
<target name='ffbuild' depends='clean, build' description='clean and create the war'/>
<target name='deploy' depends='initdirs' description='copy the war file to the app server'>
<delete verbose='true' dir='${deploy.dir}/${app.name}'/>
<fail unless='deploy.dir' message='build.properties must exist in your home directory and define deploy.dir' />
<copy todir='${deploy.dir}' file='${dist.dir}/${app.name}.war'/>
</target>
Ответ №1:
В Tomcat есть папка автоматического развертывания, в которой любой размещенный вами файл war будет автоматически распакован и развернут. Ваш файл ant просто копирует файл war в этот каталог, вызывая специальный URL-адрес в веб-приложении tomcat-manager (которое предварительно упаковано в tomcat).
С этого момента все обрабатывается ядром tomcat автоматически, просто если вы скопировали файл war в каталог webapps вручную.
Вы можете заставить ant делать намного больше с некоторыми конкретными задачами ant для tomcat. Особенно, если сервер Tomcat не находится на локальном компьютере. Смотрите эту ссылку для получения подробной информации.
Комментарии:
1. Есть одно основное отличие, API для развертывания гарантирует, что копия является атомарной, где, поскольку использование файловой системы может привести к тому, что автоматическое развертывание Tomcat начнет обрабатывать файл WAR до того, как он закончит копирование.
Ответ №2:
В вашей установке Tomcat включено автоматическое развертывание. По этой ссылке дается подробный обзор автоматического развертывания, но в двух словах Tomcat сканирует определенные каталоги на наличие обновленных web.xml и файлы war. Если он находит файл war, он развертывает его автоматически.
Лучший способ развертывания (особенно если вам когда-либо понадобится развертывание на удаленной машине) — использовать задачи Ant, поставляемые с Tomcat. На этой странице показано, как настроить файл сборки, чтобы вы могли развертывать и отменять развертывание из Ant. Страница старая, но информация все еще в порядке. Вот фрагмент build.xml Я использую для развертывания в Tomcat:
<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
<classpath>
<path location="${build-jars}/catalina-ant.jar" />
</classpath>
</taskdef>
<target name="buildAndDeploy" depends="buildWar">
<deploy url="${tomcat.manager.url}"
username="${tomcat.manager.username}"
password="${tomcat.manager.password}"
path="/${target.name}"
update="true"
war="file:${basedir}/deploy/${target.name}.war" />
</target>
Вы можете найти catalina-ant.jar в каталоге библиотеки Tomcat.
Ответ №3:
Мне очень повезло с Ant-задачами Tomcat для развертывания. Взгляните на команды диспетчера выполнения с документацией Ant для получения дополнительной информации. Если вы решите пойти по этому пути, вы должны быть в состоянии заставить его работать в короткие сроки.
Комментарии:
1. @dvanaria: В качестве отступления, ваш build.xml файл очень похож на один из файлов стандартной сборки JavaRanch … возможно, вы также могли бы обратиться за помощью к их сообществу?
Ответ №4:
Вероятно, вы сначала копируете все свои файлы в свой dest dir
файл, а затем создаете war
файл, вместо этого вам следует скопировать ваши файлы в какой-нибудь temp
каталог, создать war
файл, скопировать его в dest dir
, удалить temp
каталог.