2010-02-05 15 views
15

Estoy intentando actualizar archivos dentro de un archivo WAR existente utilizando la tarea ANT WAR. Necesito reemplazar un conjunto de archivos xml en una carpeta en WAR con nuevos de mi disco duro.Actualización de archivos dentro de un archivo WAR existente

<war destfile="myApp.war" update="true" > 
    <zipfileset dir="<PathToStubsFolderOnHDD>" includes="**/*.xml" prefix="<PathToStubsFolderInWAR>"/> 
</war> 

Esto funciona bien si el WAR original no tiene xmls con el mismo nombre. Sin embargo, si el WAR original contiene xmls con el mismo nombre; La tarea WAR no los actualiza con archivos de HDD.

documentación tarea

La ANT WAR lee:

actualización | indica si actualizar o sobrescribir el archivo de destino si ya existe. El valor predeterminado es "falso".
duplicado | comportamiento cuando se encuentra un archivo duplicado. Los valores válidos son "agregar", "preservar" y "fallar". El valor predeterminado es "agregar".

si uso update = "false"; todos los demás archivos en el WAR original se eliminan y solo se almacenan los nuevos xmls.

utilizando duplicate = "add" no tiene ningún efecto tampoco.

¿Alguna sugerencia sobre cómo se puede lograr esto?

Respuesta

11

Parece que con la opción update=true, el archivo war es más nuevo que los archivos que desea actualizar. Someone sugiere aplicar la tarea touch con '0' para solucionar el problema.

La tarea zip comprueba solo si los archivos fuente que desea agregar a un archivo zip existente son más recientes que el archivo zip. Una solución alternativa sería <touch millis="0" /> el archivo zip antes de agregar.

O usted podría hacer lo reverse stuff:

Realización de una touch antes de la war tarea en el archivo XML (s) lo hace trabajo.

0

Quizás la forma más fácil es hacer explotar la guerra en un directorio temporal, realizar los cambios y luego reconstruir la guerra. No es agradable, sin duda.

9

Gracias Aito!

Aquí está la secuencia de comandos completa ANT:

<target name = "UpdateWARWithStubs" 
    description="Updates WAR file with files from Stub folder"> 

    <!-- Use touch to set modification time of all stubs to current time. This will force war task to update stub files inside the war --> 
    <tstamp> <format property="touch.time" pattern="MM/dd/yyyy hh:mm aa"/> </tstamp> 
    <touch datetime="${touch.time}"> 
     <fileset dir="${path.to.stubs.on.hdd}" /> 
    </touch> 

    <war destfile="myApp.war" update="true"> 
     <zipfileset dir="${path.to.stubs.on.hdd}" prefix="${path.to.stubs.in.war}"/> 
    </war> 
</target> 
+0

¿Dónde está el camino de la guerra en el fichero de guerra que actualizarse definido en el ejemplo anterior? – ziggy

+0

Podrías codificar la ruta como destfile = "path/for/war/myApp.war" o mejor leer el valor de las propiedades $ {path.for.war}/$ {file.name.war} –

+0

Estoy intentando haz algo similar ' ' yellavon

0

Ésta es mi solución para reemplazar los archivos existentes en zip (.war). El estado inicial es que tengo build.xml para compilar y empaquetar mywebapp.war para el servidor Tomcat6. Se requieren cambios de configuración menores dentro del archivo war para el servidor Tomcat7.

  • proyecto subcarpetas web y webT7 son carpetas controladas por CVS, no quiero tocar las marcas de tiempo sin motivo. El siguiente truco hace el trabajo.
  • compilar y crear web/WEB-INF/lib/mywebapp.archivo jar como de costumbre
  • target "war" crea el archivo tomcat6 desde la carpeta web
  • tiene algunos archivos específicos en la subcarpeta webT7 como META-INF/context.xml y WEB-INF/web.xml Tengo que modificar un poco para cada versión de tomcat.
  • crear una copia del archivo mywebapp.war.zip
  • copiar archivos de la subcarpeta webT7 en una nueva carpeta de compilación temp, no utilizar el atributo preservelastmodified !!! Esto le da una nueva marca de tiempo para cada archivo, por lo que su toque sin comando táctil por separado.
  • failsafe toque el nuevo código postal para pasar la marca de tiempo, esto asegura que la actualización zip funciona correctamente.
  • use la tarea zip para actualizar el contenido de mywebapp.war_T7.zip, debe reemplazar los archivos existentes porque los copiamos sin preservar las marcas de tiempo originales.

Motivo por el que copio el contenido de webT7 en una carpeta de temp build son los sistemas de gestión de contenido. No quiero cambiar las marcas de tiempo de los archivos del repositorio original sin ningún motivo. Todo lo demás compila, jar, objetivos de guerra son siempre los mismos sin importar el objetivo Tomcat que uso.

Zip update = "true" El atributo como se dijo anteriormente no reemplaza los archivos, solo se actualiza si zip tenía un archivo anterior al que proporcionamos. Esto puede presentar problemas si tengo archivos web/config.jsp (2013-01-21 14:01:01) y webT7/config.jsp (2012-12-21 15:02:03). El archivo no fue reemplazado

de fragmentos de archivo build.xml

<target name="war" depends="compile,jar" description="Create a .war file"> 
    <delete file="${name}.war.zip" /> 
    <zip destfile="${name}.war.zip" 
     basedir="./web/" 
     excludes=" 
      **/CVS* 
      " 
    /> 
</target> 

<target name="warT7" depends="war" description="Create a .war file for Tomcat7"> 
    <delete dir="${build}" /> 
    <mkdir dir="${build}" /> 

    <delete file="${name}.war_T7.zip" /> 
    <copy file="${name}.war.zip" 
     tofile="${name}.war_T7.zip" overwrite="true" preservelastmodified="true" 
    />  

    <copy todir="${build}" overwrite="true"> 
     <fileset dir="./webT7" /> 
    </copy> 

    <touch datetime="01/31/1981 01:00:00 AM" file="${name}.war_T7.zip" /> 
    <zip destfile="${name}.war_T7.zip" update="true"> 
     <zipfileset dir="${build}" prefix="" /> 
    </zip> 
    <delete dir="${build}" /> 
</target> 
0

Ninguna opción táctil trabajó para mí. El archivo de guerra original que está creando un artefacto de experto dentro del script ant debe tener algo que ver con esto. Terminó el reenvasado el archivo de la guerra en un archivo temporal y sobrescribir el archivo original de la guerra como esta:

<target name="update-properties"> 
    <war destfile="target/${war.name}temp" needxmlfile='false'> 
     <zipfileset src="target/${war.name}" includes="**/*" 
         excludes="${path.to.properties.in.war}" /> 
     <zipfileset file="${path.to.new.properties}" 
         fullpath="${path.to.properties.in.war}" /> 
    </war> 
    <move file="target/${local.war.name}temp" tofile="target/${local.war.name}"/> 
    <delete file="target/${local.war.name}temp"/> 
</target> 

donde ${path.to.properties.in.war} puede ser algo como "WEB-INF/classes/META-INF/spring/database.properties"

Cuestiones relacionadas