Ant中的Zip任务,包括空的和非空的子目录



好吧,我已经有点疯了——更让我恼火的是,我确信几年前我做过类似于我现在正在做的事情。

让我马上说,我正在使用ANT 1.8.2版本,所以我没有1.6.2的问题与zip和空文件夹。我的大部分搜索似乎都指向1.6.2的问题。

所以,这是我的build。xml片段:
<target name="zip" depends="jar">  
    <echo>Creating zip file...</echo>  
    <zip destfile="${dist}/${zipfilename}">  
        <zipfileset dir="${dist}" includes="${jarfilename}" />  
    </zip>  
    <echo>...complete</echo>  
</target> 

这是它应该做的,从{dist}目录中取出jar文件,并将其放入zip中,以便不维护{dist}目录-即:jar文件被解压缩到zip文件所在的位置。

然而,我想知道如何做到以下几点:

  • 包含一个{config}目录和其中的所有文件,除了一个名为"test-config.xml"的
  • 包含两个单独的空目录-例如{subdir1}和{subdir2}。它们可能有也可能没有文件,但我不希望在这些目录中有任何文件,当它们被压缩。

对于使用空目录的第二部分,我完全满足于让zip任务在zip文件本身中创建这些目录,而不必在本地文件系统上创建它们。事实上,最理想的情况是它们在zip文件中,而不是在本地文件系统中——但我会采取任何我能找到的有效方法。

所以,我的本地文件系统看起来像这样:

  • dist/MyJar.jar
  • 配置/config1.xml
  • 配置/config2.xml
  • 配置/test-config.xml
  • subdir1/(可能存在,也可能不存在,也可能没有文件)
  • subdir2/(可能存在,也可能不存在,也可能没有文件)

我希望ZIP文件在解压缩时得到:

  • MyJar.jar
  • 配置/config1.xml
  • 配置/config2.xml
  • subdir1/
  • subdir2/

我如何做到这一点?我尝试过各种文件集、dirset、zipfileset,但每次尝试都失败了。我所管理的最好的方法是让{config}目录中的文件被提取,就像{config}目录不存在一样……

以下是使用zipfileset处理config目录的一种方法:

<zipfileset dir="." includes="config/*" excludes="config/test-config.xml"/>

我能想到的将空文件夹放入zip的唯一方法是在文件系统上创建它们,使用zipfileset添加它们,然后在创建zip文件后删除它们。

这是一个片段,做什么你需要(注意:我使用文件夹和文件名基于你的例子;您可以根据需要将其替换为属性引用):

<tempfile property="temp.file" destDir="." prefix="foo"/>
<mkdir dir="${temp.file}/subdir1"/>
<mkdir dir="${temp.file}/subdir2"/>
<zip destfile="${dist}/${zipfilename}">
  <zipfileset dir="${dist}" includes="${jarfilename}"/>
  <zipfileset dir="${temp.file}" includes="*"/>
  <zipfileset dir="." includes="config/*" excludes="config/test-config.xml"/>
</zip>
<delete dir="${temp.file}"/>

最新更新