Обновление файлов внутри существующего файла WAR - PullRequest
15 голосов
/ 05 февраля 2010

Я пытаюсь обновить файлы в существующем файле WAR, используя задачу ANT WAR. Мне нужно заменить набор файлов xml в папке в WAR новыми файлами с моего жесткого диска.

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

Это прекрасно работает, если в оригинальной WAR нет xmls с тем же именем. Однако если оригинальная WAR содержит xmls с тем же именем; Задача WAR не обновляет их с файлов с жесткого диска.

Документация задачи ANT WAR гласит:

обновление | указывает, обновлять или перезаписывать файл назначения, если он уже существует. По умолчанию установлено значение «false».
дубликат | поведение при обнаружении дубликата файла. Допустимые значения: «add», «preserve» и «fail». Значением по умолчанию является «добавить».

если я использую update = "false"; все остальные файлы в оригинальной WAR удаляются и сохраняются только новые xmls.

использование duplicate = "add" также не имело никакого эффекта.

Любые предложения о том, как этого можно достичь ??

Ответы [ 5 ]

11 голосов
/ 05 февраля 2010

Похоже, что с параметром update=true файл war более новый, чем файлы, которые вы хотите обновить. Кто-то предлагает применить задачу touch с '0', чтобы обойти проблему.

Задача zip проверяет только, являются ли исходные файлы, которые вы хотите добавить в существующий zip, более свежими, чем zip. Обходным путем будет <touch millis="0" /> ZIP-файл перед добавлением.

Или вы можете сделать реверс :

Выполнение touch до того, как задача war для файла (ов) XML сделает это работа.

9 голосов
/ 08 февраля 2010

Спасибо, Айто!

Вот полный скрипт 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>
1 голос
/ 16 января 2013

Это моё решение заменить существующие файлы в zip (.war) файлах. Исходное состояние: у меня есть build.xml для компиляции и упаковки mywebapp.war для сервера Tomcat6. Для сервера Tomcat7 требуются незначительные изменения конфигурации в файле war.

  • Проектные подпапки web и webT7 являются папками, управляемыми CVS, я не хочу трогать метки времени без причины. Следующая уловка делает работу.
  • скомпилируйте и создайте файл web / WEB-INF / lib / mywebapp.jar как обычно
  • target "war" создает архив tomcat6 из веб-папки
  • имеет несколько определенных файлов в подпапке webT7, таких как META-INF / context.xml и WEB-INF / web.xml, которые мне нужно немного изменить для каждой версии tomcat.
  • создать копию файла mywebapp.war.zip
  • копировать файлы из подпапки webT7 в новую временную папку сборки, не используйте preservelastmodified атрибут !!! Это дает новую временную метку для каждого файла, поэтому ее касания без отдельной команды прикосновения.
  • Отказоустойчивое прикосновение к новому zip, чтобы поставить метку времени в прошлом, это гарантирует, что обновление zip работает правильно.
  • используйте задачу zip для обновления содержимого mywebapp.war_T7.zip, оно должно заменить существующие файлы, потому что мы скопировали их без сохранения оригинальных временных меток.

Причина, по которой я копирую содержимое webT7 в папку временного компоновки, - системы управления контентом. Я не хочу менять временные метки исходных файлов репозитория без причины. Все остальное компилируется, фляга, военные цели всегда одинаковы, независимо от того, какую цель Tomcat я использую.

Zip update = "true" атрибут, как было сказано ранее, не заменяет файлы, он обновляется только в том случае, если zip имел более старый файл, чем тот, который мы дали. Это может создать проблемы, если у меня есть файлы web / config.jsp (2013-01-21 14:01:01) и webT7 / config.jsp (2012-12-21 15:02:03). Файл не был заменен.

Фрагмент из файла 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 голосов
/ 19 марта 2013

Ни один из вариантов касания не работал для меня. Исходный файл войны, создаваемый артефактом maven из сценария ant, может иметь к этому отношение. Закончилась переупаковка файла войны в временный файл и перезапись исходного файла войны следующим образом:

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

где ${path.to.properties.in.war} может быть что-то вроде "WEB-INF/classes/META-INF/spring/database.properties"

0 голосов
/ 05 февраля 2010

Пожалуй, самый простой способ - развернуть войну во временный каталог, внести изменения и затем перестроить войну. По общему признанию, не очень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...