2011-03-31 90 views
1

我试图使用<concat>作为<zip>任务中的资源集合,根据文档,这应该起作用。我想这样做是因为我想在zip中包含的某些文件需要扩展某些属性,所以我还会将<filterchain>添加到<concat>中来执行此操作。我宁愿直接做,而不是复制到临时位置(使用属性替换),并将副本包含在zip文件中。concat作为zip中的资源集合不起作用?

但是,我似乎无法得到<zip>正确使用<concat>元素。

什么,我至今一个简单的例子:

<zip destfile="target/dist.zip"> 
    <concat> 
     <fileset file="CHANGES.txt" /> 
    </concat> 
</zip> 

这将创建一个包含多个目录中所有命名concat (C:(显然这是在Windows机器上)的zip文件。

我错过了什么?

回答

3

一位同事和我通过查看<zip><concat>来源得出答案。确实有两个答案:

  1. <concat>的执行ResourceCollection界面很奇怪,但我们明白为什么。
  2. 有一种解决方法。

对于#1,而<concat>ResourceCollection(如FileSet),返回作为它包含一个硬编码值单Resource名称引擎盖下:

"concat (" + String.valueOf(c) + ")"; 

看起来很熟悉?

通常忽略资源的名称 - 除了<zip>及其相关任务(使用资源名称作为ZipEntry名称)之外。由于<concat>返回奇怪的名字,这就是我们在zip文件中得到的。

我还没弄清楚为什么我会得到多个条目,但这并不重要:观察导致了一个复杂的解决方案。

由于我知道要创建的ZipEntry的名称,因此我可以使用<mapper><concat>资源命名。以下是我想出了在其所有的荣耀:

<zip destfile="target/distribution.zip"> 
    <fileset dir="."> 
     <exclude name="target/**" /> 
     <exclude name="CHANGES.txt" /> 
    </fileset> 
    <mappedresources> 
     <concat> 
      <fileset file="CHANGES.txt" /> 
      <filterchain> 
       <expandproperties /> 
      </filterchain> 
     </concat> 
     <mergemapper to="CHANGES.txt" /> 
    </mappedresources> 
</zip> 

正如我的同事说:“在每一个蚂蚁可以解决问题使用映射器”。

这仅适用于Ant 1.8+,因为在该版本中添加了<mappedresources>

我要发表一些意见,以蚂蚁的邮件列表,并提出了几个增强:

  1. 允许时,它被用来作为ResourceCollection被指定的资源名称作为一个属性上<concat>
  2. 如果调用getName()而没有指定值,则抛出异常(并且不要创建合成值)。
  3. 最后,虽然不直接相关,但我希望<expandproperties>可能需要<propertyset>,所以我可以控制哪些属性被替换。
0

你想让最终的zip包含单个文件或多个文件吗?就我所见,使用concat(成功完成时,上面没有完成)将生成一个文件,即资源集合中所有文件连接的结果。

如果你想要多个文件而不是连接,我认为你需要中间拷贝。

从为CONCAT任务Ant手册:

由于Apache Ant的1.7.1,这个任务可以 作为一个资源集合, 将返回一资源。

+0

最终的zip文件将包含多个文件,我使用的是''(未在我的示例中显示)。我希望使用''与指定的''(也未显示)来执行属性替换的一个文件。我所给出的例子根本不起作用,因为我预计它将基于您引用的文档,而不考虑添加任何其他文件或进行属性替换。 – 2011-03-31 18:05:58

+0

非常感谢。你的期望不清楚原来的问题,但我现在明白了。我在zip里玩了一下concat。行为很奇怪。 – sudocode 2011-04-01 08:15:21