更新现有WAR文件中的文件

时间:2010-02-05 20:03:12

标签: ant

我正在尝试使用ANT WAR任务更新现有WAR文件中的文件。 我需要用WAR中的新文件替换WAR中文件夹中的一组xml文件。

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

如果原始WAR没有具有相同名称的xmls,则此方法可以正常工作。但是,如果原始WAR包含具有相同名称的xmls; WAR任务不会使用HDD中的文件更新它们。

ANT WAR任务文档如下:

  

更新|指示是否更新或覆盖目标文件(如果已存在)。默认为“false”。
  重复|找到重复文件时的行为。有效值为“add”,“preserve”和“fail”。默认值为“add”。

如果我使用update =“false”;原始WAR中的所有其他文件都将被删除,只存储新的xmls。

使用duplicate =“add”也没有任何效果。

有关如何实现这一目标的任何建议吗?

5 个答案:

答案 0 :(得分:11)

似乎使用update=true选项,war文件比您要更新的文件更新。 Someone建议将touch任务应用于'0'以解决问题。

  

zip任务仅检查您要添加到现有zip的源文件是否比zip更新。在添加之前,解决方法是<touch millis="0" /> zip文件。

或者您可以执行reverse stuff

  

在XML文件的touch任务之前执行war   工作

答案 1 :(得分:9)

谢谢Aito!

以下是完整的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>

答案 2 :(得分:1)

这是我替换zip(.war)文件中现有文件的解决方案。初始状态是我有build.xml来编译和打包Tomcat6服务器的mywebapp.war。 Tomcat7服务器需要war文件中的次要配置更改。

  • 项目子文件夹web和webT7是CVS控制的文件夹,我不想无缘无故地触摸时间戳。以下技巧可以完成这项任务。
  • 照常编译并创建web / WEB-INF / lib / mywebapp.jar文件
  • 目标“war”从网络文件夹创建tomcat6存档
  • 在webT7子文件夹中有很少的特定文件,例如META-INF / context.xml和WEB-INF / web.xml,我必须为每个tomcat版本修改一下。
  • 创建mywebapp.war.zip文件的副本
  • 将文件从webT7子文件夹复制到新的构建临时文件夹,不要使用preservelastmodified属性!这为每个文件提供了一个新的时间戳,因此它的触摸没有单独的触摸命令。
  • 故障安全触摸新拉链以放置时间戳,这可确保zip更新正常工作。
  • 使用zip任务更新mywebapp.war_T7.zip内容,它应该替换现有文件,因为我们在不保留原始时间戳的情况下复制它们。

原因我将webT7内容复制到临时构建文件夹是内容管理系统。我不想无缘无故地更改原始存储库文件的时间戳。无论我使用什么Tomcat目标,其他所有编译,jar,war目标总是相同的。

如前所述,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>

答案 3 :(得分:0)

也许最简单的方法是将战争爆炸到临时目录,进行更改,然后重建战争。不可否认,不太好。

答案 4 :(得分:0)

两种触控选项都不适用于我。由ant脚本中的maven工件创建的原始war文件可能与此有关。结束将war文件重新打包到临时文件中并覆盖原始war文件,如下所示:

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