在zip中资源集合的concat不起作用?

时间:2011-03-31 12:34:34

标签: ant

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

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

到目前为止我所拥有的一个简化示例:

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

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

我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

  1. <concat> ResourceCollection接口的实现很奇怪,但我们理解为什么。
  2. 有一种解决方法。
  3. 对于#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中,每个问题都可以使用映射器解决。”

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

    我将在Ant邮件列表中发布一些评论并提出一些改进建议:

    1. <concat>用作ResourceCollection时,允许将资源名称指定为getName()上的属性。
    2. 如果在未指定值的情况下调用<expandproperties>,则抛出异常(并且不创建合成值)。
    3. 最后,虽然没有直接相关,但我希望<propertyset>可以使用{{1}},以便我可以控制哪些属性被替换。

答案 1 :(得分:0)

您希望最终的zip包含单个文件还是多个文件?据我所知,使用concat(成功完成,上面没有完成)会生成一个文件,这是资源集合中所有文件连接的结果。

如果你想要多个文件而不是连接,我认为中间副本就是你需要的。

来自Ant手册的concat任务:

  

自Apache Ant 1.7.1以来,此任务可以   用作资源集合   将只返回一个资源。