2011-05-25 15 views
7

Estoy usando Apache Ant 1.8 para implementar una aplicación web en un servidor Tomcat local, y el archivo build.xml (a continuación) produce el efecto deseado cuando ejecuto 'ant deploy' en la línea de comando.Cómo Apache Ant implementa el archivo .war en Tomcat

Mi pregunta es, noté que el archivo .war se coloca donde lo esperaba (deploy.dir está definido en el archivo build.properties de mi directorio personal), pero también desempaquetó inesperadamente el .war y extrajo el contexto en sí mismo en ese mismo directorio. ¿Dónde se configura eso en el siguiente archivo 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> 

Respuesta

12

Tomcat tiene una carpeta autodeploy en el que cualquier archivo de la guerra que se coloca automáticamente será descomprimido y desplegado. Su archivo ant está simplemente copiando el archivo war en este directorio llamando a una URL especial en la aplicación web tomcat-manager (que está empaquetada previamente en el tomcat).

A partir de este punto, todo se maneja automáticamente por tomcat core, solo si se copió manualmente el archivo war en el directorio webapps.

Puede hacer que la hormiga haga mucho más con algunas tareas específicas de hormigas para tomcat. Especialmente si el servidor Tomcat no está en la máquina local. See this link for details.

0

Probablemente, se intenta por primera copiar todos los archivos en su dest dir un war archivo a continuación, haciendo, en su lugar debe copiar los archivos en un directorio temp, crear war archivo, copiarlo a dest dir, retire temp directorio.

1

He tenido muy buena suerte con las tareas Ant de Tomcat para la implementación. Eche un vistazo a Executing Manager Commands With Ant documentation para obtener información. Si decides seguir esa ruta, deberías poder hacer que funcione en poco tiempo.

+0

@dvanaria: Como un lado, su archivo build.xml se parece mucho a [uno de los archivos de compilación estándar de JavaRanch] (http://www.javaranch.com/drive/servlet/index.jsp#ant). ... ¿quizás también podrías pedirle ayuda a su comunidad? –

3

Tiene activado el despliegue automático en la instalación de Tomcat. This link ofrece una descripción detallada de la implementación automática, pero en pocas palabras, Tomcat escanea ciertos directorios para obtener archivos web.xml y war actualizados. Si encuentra un archivo war, lo despliega automáticamente.

Una mejor forma de implementarlo (especialmente si alguna vez tendrá que implementarlo en una máquina remota) es usar las tareas Ant que vienen con Tomcat. This page muestra cómo configurar su archivo de compilación para que pueda implementar y anular la implementación desde Ant. La página es vieja pero la información sigue siendo buena. He aquí un fragmento de un build.xml que utilizo para desplegar en 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> 

puede encontrar catalina-ant.jar en el directorio lib de Tomcat.

Cuestiones relacionadas