我正在尝试使用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”也没有任何效果。
有关如何实现这一目标的任何建议吗?
答案 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文件中的次要配置更改。
原因我将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"