我正在尝试创建2个zip文件作为ant任务的一部分。两者都相似,但其中一个包括一些额外的数据。所以为了减少代码,我想定义一个文件集并引用它。唯一的问题是产生错误。
任务:
<target name="create-zips" depends="cleanup, compile, package-jar">
<zipfileset id="zipfiles">
<zipfileset dir="${ant.project.name}-dist" includes="${jarname}.jar" prefix="${title}"/>
<zipfileset dir="${scripts.dir}" includes="myprogram" filemode="755" prefix="${title}"/>
<zipfileset dir="${scripts.dir}" includes="myprogram_gui" filemode="755" prefix="${title}"/>
<zipfileset dir="${scripts.dir}" includes="myprogram_gui.command" filemode="755" prefix="${title}"/>
<zipfileset dir="${scripts.dir}" includes="myprogram.bat" filemode="755" prefix="${title}"/>
<zipfileset dir="${scripts.dir}" includes="myprogram_gui.bat" filemode="755" prefix="${title}"/>
<zipfileset dir="${docs.dir}" includes="myprogram_readme.txt" prefix="${title}"/>
</zipfileset>
<zip destfile="${deploy.dir}/myprogram_${version}.zip" whenempty="fail" defaultexcludes="true">
<zipfileset refid="zipfiles"/>
<zipfileset dir="${otherdata.dir}" includes="other/*.*" prefix="${title}"/>
</zip>
<zip destfile="${deploy.dir}/myprogram_noother_${version}.zip" whenempty="fail" defaultexcludes="true">
<zipfileset refid="zipfiles"/>
</zip>
</target>
任务运行时:
create-zips:
BUILD FAILED
/path/to/my/buildfile/build-tools.xml:119: Problem opening /path/to/my/data/docs/myprogram_readme.txt
我已经确认该文件存在。删除自述文件只包括使错误发生在不同的文件上。此外,如果我只是将zipfileset复制并粘贴到2个单独的标签中,一切正常。但我宁愿不这样做。
编辑:2011年10月14日编译的Apache Ant(TM)版本1.8.2,Mac OS X 10.7。没有试过任何其他平台。
答案 0 :(得分:1)
我曾试图做同样的事,但无济于事。 fileset
不接受嵌套fileset
。当您尝试作弊并使用zipfileset
作为外部集时,ant会将其内容视为zip文件。当ant尝试解压缩您的文件时,您会收到打开错误。
fileset
必须具有dir
属性。此目录必须是所有文件集组件的父级。悲伤却又是真的。
我最终解决了这个问题。创建X文件集。可以将这些文件集指定为zip
任务的嵌套元素。如果在给定的情况下你需要少于X,那么为所有X文件集制作一个默认值,并且zip总是全部为X.
<!-- define X empty filesets -->
<fileset dir="c:\temp\1" includes="asdfasdf.neverhappens" id="nullfileset" />
<fileset id="zipfileset2" refid="nullfileset" />
<fileset id="zipfileset3" refid="nullfileset" />
<!-- here go real sets -->
<zipfileset dir="${scripts.dir}" includes="myprogram" />
小心ant文件集。它们是可变的。我曾写过一个关于它的“问题”,但有人删除了它。做得好的安静的工作,堆叠的人,“谢谢”。
EDIT1:在Linux上,可以尝试dir="/"
并使用嵌套在fileset
内的selector
s。因为我的问题我在Windows上,所以我不能这样做。 Windows上没有“/”,我从不同的驱动器收集文件。