Ant 更新现有WAR文件中的文件
我正在尝试使用ANT WAR任务更新现有WAR文件中的文件。 我需要用硬盘中的新文件替换WAR文件夹中的一组xml文件Ant 更新现有WAR文件中的文件,ant,Ant,我正在尝试使用ANT WAR任务更新现有WAR文件中的文件。 我需要用硬盘中的新文件替换WAR文件夹中的一组xml文件 <war destfile="myApp.war" update="true" > <zipfileset dir="<PathToStubsFolderOnHDD>" includes="**/*.xml" prefix="<PathToStubsFolderInWAR>"/> </war> 如果原始W
<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的情况下尝试了它,但构建失败。有什么建议吗?