2010-02-05 6 views
15

Ich versuche, Dateien in einer vorhandenen WAR-Datei mithilfe der ANT WAR-Aufgabe zu aktualisieren. Ich muss einen Satz von XML-Dateien in einem Ordner in WAR durch neue von meiner Festplatte ersetzen.Aktualisieren von Dateien in einer vorhandenen WAR-Datei

Das funktioniert gut, wenn die ursprüngliche WAR nicht Xmls mit demselben Namen hat. Allerdings, wenn der ursprüngliche WAR Xmls mit demselben Namen enthält; Die WAR-Task aktualisiert sie nicht mit Dateien von der Festplatte.

Die ANT WAR Aufgabe Dokumentation lautet:

update | gibt an, ob die Zieldatei aktualisiert oder überschrieben werden soll, wenn sie bereits existiert. Standard ist "falsch".
duplizieren | Verhalten, wenn eine doppelte Datei gefunden wird. Gültige Werte sind "add", "preserve" und "fail". Der Standardwert ist "Hinzufügen".

wenn ich update = "false" verwende; Alle anderen Dateien im ursprünglichen WAR werden gelöscht und nur die neuen xmls gespeichert.

using duplicate = "add" hatte auch keinen Effekt.

Irgendwelche Vorschläge, wie dies erreicht werden kann ??

Antwort

11

Scheint, dass mit der Option update=true die War-Datei neuer als die Dateien ist, die Sie aktualisieren möchten. Someone schlagen vor, die touch Aufgabe mit '0' zur Problemumgehung anzuwenden.

Die ZIP-Aufgabe wird nur überprüft, wenn die Quelldateien, die Sie einer vorhandenen ZIP hinzufügen möchten, aktueller sind als die ZIP-Datei. Eine Umgehung wäre <touch millis="0" /> die ZIP-Datei vor dem Hinzufügen.

Oder Sie könnten die reverse stuff tun:

Durchführen einer touch vor dem war Aufgabe auf XML-Datei (en) macht es Arbeit.

0

Vielleicht ist der einfachste Weg, den Krieg zu einem temporären Verzeichnis zu explodieren, Ihre Änderungen vorzunehmen und dann den Krieg wieder aufzubauen. Nicht nett, zugegebenermaßen.

9

Danke Aito!

Dies ist der komplette ANT-Skript:

<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

werden, wo der Krieg Pfad zur WAR-Datei ist zu aktualisierenden definiert im obigen Beispiel? – ziggy

+0

Sie könnten einfach den Pfad als Zieldatei festschreiben "path/for/war/myApp.war" oder besser lesen Sie den Wert aus den Eigenschaften $ {path.for.war}/$ {file.name.war} –

+0

Ich versuche es mach etwas ähnliches. ' ' yellavon

0

Dies ist meine Lösung vorhandene Dateien in zip (.war) Datei zu ersetzen. Anfangszustand ist ich build.xml, um mywebapp.war für Tomcat6 Server zu kompilieren und zu verpacken. Geringfügige Konfigurationsänderungen in der WAR-Datei sind für den Tomcat7-Server erforderlich.

  • Projektunterordner web und webT7 sind CVS-gesteuerte Ordner, ich möchte keine Zeitstempel ohne Grund berühren. Der folgende Trick macht den Job.
  • kompilieren und Web/WEB-INF/lib/mywebapp erstellen.jar-Datei wie gewohnt
  • Ziel „Krieg“ schafft tomcat6 Archiv von Web-Ordner
  • haben einige spezifische Dateien in webT7 Unterordner wie META-INF/context.xml und WEB-INF/web.xml, die ich ein ändern müssen Bit für jede Tomcat-Version.
  • Erstellen Sie eine Kopie der Datei mywebapp.war.zip
  • kopieren Sie Dateien aus WebT7-Unterordner in einen neuen Build-Temp-Ordner, verwenden Sie nicht preservelestmodified Attribut !!! Dies gibt einen neuen Zeitstempel für jede Datei, also ihre Berührungen ohne separaten Touch-Befehl.
  • Failsafe Touch neue Zip um vergangene Zeitstempel zu setzen, dies stellt sicher, dass Zip-Update ordnungsgemäß funktioniert.
  • Verwenden Sie zip-Task, um den Inhalt von mywebapp.war_T7.zip zu aktualisieren. Er sollte vorhandene Dateien ersetzen, da wir sie kopiert haben, ohne die ursprünglichen Zeitstempel beizubehalten.
  • Grund Ich kopiere webT7 Inhalt in einen temporären Build-Ordner ist Content-Management-Systeme. Ich möchte die Zeitstempel der ursprünglichen Repository-Dateien nicht grundlos ändern. Alles andere kompilieren, jar, Kriegsziele sind immer gleich, egal welches Tomcat-Ziel ich verwende.

    Zip update = "true" -Attribut wie schon gesagt, keine Dateien ersetzen, es wird nur aktualisiert, wenn zip eine ältere Datei als die, die wir geben, hat. Dies kann zu Problemen führen, wenn ich die Dateien web/config.jsp (2013-01-21 14:01:01) und webT7/config.jsp (2012-12-21 15:02:03) habe. Die Datei wurde nicht ersetzt.

    Snippet aus build.xml Datei

    <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

    Weder Touch-Option für mich gearbeitet. Die ursprüngliche Kriegsdatei, die von einem Maven-Artefakt aus dem Ameisen-Skript erstellt wurde, könnte etwas damit zu tun haben. Endete die WAR-Datei in eine temporäre Datei Umpacken und die ursprüngliche Kriegs-Datei wie folgt überschreiben:

    <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> 
    

    wo ${path.to.properties.in.war} kann so etwas wie "WEB-INF/classes/META-INF/spring/database.properties"

    Verwandte Themen