好吧,我已经有点疯了——更让我恼火的是,我确信几年前我做过类似于我现在正在做的事情。
让我马上说,我正在使用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}"/>