Как Apache Ant развертывает.файл war в Tomcat

#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 каталог.