通过refid创建zip文件时出错

时间:2012-02-28 16:58:15

标签: ant fileset

我正在尝试创建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。没有试过任何其他平台。

1 个答案:

答案 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内的selectors。因为我的问题我在Windows上,所以我不能这样做。 Windows上没有“/”,我从不同的驱动器收集文件。