Ant 更新现有WAR文件中的文件

Ant 更新现有WAR文件中的文件,ant,Ant,我正在尝试使用ANT WAR任务更新现有WAR文件中的文件。 我需要用硬盘中的新文件替换WAR文件夹中的一组xml文件 <war destfile="myApp.war" update="true" > <zipfileset dir="<PathToStubsFolderOnHDD>" includes="**/*.xml" prefix="<PathToStubsFolderInWAR>"/> </war> 如果原始W

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

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

如果原始WAR中没有同名的XML,那么这种方法可以很好地工作。但是,如果原始WAR包含同名的XML;WAR任务不会使用来自HDD的文件更新它们

ANT WAR任务文档内容如下:

update |指示是否更新或覆盖目标文件(如果目标文件已存在)。默认值为“false”。
重复|发现重复文件时的行为。有效值为“添加”、“保留”和“失败”。默认值为“添加”

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

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


关于如何实现这一点有什么建议吗?

也许最简单的方法是将war分解到一个临时目录,进行更改,然后重建war。不好,不可否认。

似乎使用
update=true
选项,war文件比您要更新的文件要新。建议使用带有“0”的
触摸任务来解决问题

仅当要添加到现有zip的源文件比zip更新时,zip任务才会进行检查。一种解决方法是在添加之前先
压缩文件

或者你可以这样做:

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

谢谢艾托

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

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

  • project子文件夹web和webT7是CVS控制的文件夹,我不想无缘无故地触摸时间戳。下面的技巧可以做到这一点
  • 像往常一样编译并创建web/web-INF/lib/mywebapp.jar文件
  • 目标“war”从web文件夹创建tomcat6存档
  • 在webT7子文件夹中有一些特定的文件,比如META-INF/context.xml和WEB-INF/WEB.xml,我必须为每个tomcat版本修改一些文件
  • 创建mywebapp.war.zip文件的副本
  • 将文件从webT7子文件夹复制到新的build temp文件夹,不要使用preservelastmodified属性!!!这为每个文件提供了一个新的时间戳,因此它的触摸没有单独的触摸命令
  • 故障保护触摸新的zip以放置过去的时间戳,这确保zip更新正常工作
  • 使用zip任务更新mywebapp.war_T7.zip内容,它应该替换现有文件,因为我们复制了这些文件而没有保留原始时间戳
我将webT7内容复制到临时构建文件夹的原因是内容管理系统。我不想无缘无故地更改原始存储库文件的时间戳。无论我使用什么Tomcat目标,其他编译、jar、战争目标都是相同的

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>

两个触摸选项都不适合我。由maven工件从ant脚本中创建的原始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”

上面示例中定义的war文件的war路径在哪里?您可以将路径硬编码为destfile=“path/for/war/myApp.war”,或者更好地从属性${path.for.war}读取值/${file.name.war}我正在尝试做类似的事情<代码>
堆栈溢出不允许我编辑以前的注释。。。我正在尝试做类似的事情<代码>我的额外文件在战争中,但WEB-INF不见了。我在不需要XmlFile的情况下尝试了它,但构建失败。有什么建议吗?