macrodef'd <jar>任务不像隐式文件集?

时间:2017-03-31 20:32:51

标签: ant

使用标准Ant 1.9.7汇编一堆jar文件。我们制作了一个宏来帮助减少XML的详细程度:

<!-- All 'description' bits snipped for SO posting. -->
<macrodef name="buildjar">
  ... bunch of <attribute> ...
  <element name="also"/>
  <sequential>
    <jar ....>
      <manifest>  ...  </manifest>
      <fileset what="stuff in every jar file" />
      <fileset what="and this stuff too" />
      <mappedresources if:true="beauty">
        <fileset for when truth is beauty/>
        <globmapper from="ugly" to="beauty"/>
      </mappedresoruces>

      <!-- Anything else for this specific jar. -->
      <also/>

    </jar>
  </sequential>
</macrodef>

这有效:

<buildjar .........>
  <also>
    <fileset file="/some/path/somewhere/a_single_file"/>
  </also>
</buildjar>

但这不是:

<buildjar .........>
  <also>
    <include name="/some/path/somewhere/a_single_file"/>
  </also>
</buildjar>

没有错误。查看ant -d输出,根本没有提及附加条目,第一个示例中有一行fileset: Setup scanner in dir /some/path/somewhere with patternSet{ includes: [a_single_file] excludes: [] }

同上多个文件。这有效:

<buildjar .........>
  <also>
    <fileset dir="/some/path/somewhere">
      <include name="one_file" />
      <include name="foo**" />
    </fileset>
  </also>
</buildjar>

但这不是:

<buildjar .........>
  <also>
    <include name="/some/path/somewhere/one_file"/>
    <include name="/some/path/somewhere/foo**"/>
  </also>
</buildjar>

根据<jar>的Ant手册页面,

  

此任务形成隐式文件集,并支持&lt; fileset&gt;的大部分属性。 (dir成为basedir)以及嵌套&lt; include&gt; ,&lt; exclude&gt;和&lt; patternset&gt;元件。

所以理论上,<include>不应该足够,并且成为宏<jar>的嵌套元素吗?

显然,在实践中这不是一个问题(我们在构建文件中发出一个巨大的评论,告诉人们不要忽略明确的<fileset>)。我们不能将<fileset>放入宏定义中,如下所示:

<macrodef name="buildjar">
  <element name="also"/>
  <sequential>
    <jar ....>
      .....
      <!-- Anything else for this specific jar. -->
>>    <fileset dir="some_generic_base_path">
        <also/>
>>    </fileset>
    </jar>
  </sequential>
</macrodef>

因为当调用代码在没有任何buildjar块的情况下执行also 时,无限制文件集将包含整个some_generic_base_path树。

这只是macrodef和文件集之间的一些交互,这让我们感到惊讶吗?

1 个答案:

答案 0 :(得分:0)

简短回答是否定的 - 它不是宏观问题。要使用隐式文件集,您必须为basedir任务指定<jar>属性。以下是一个例子:

<jar destfile="my.jar">
    <include name="a/b" />
</jar>

<zip destfile="my.zip" >
    <include name="a/b" />
</zip>

在示例中,<jar>任务将成功并创建仅清单的jar文件。但是<zip>任务将失败说:

BUILD FAILED
build.xml:8: basedir attribute must be set, or at least one resource collection must be given!

jar任务基于zip任务并继承其对资源的检查。因为jar任务有一些 - 清单 - 不会抛出错误。

如果要使用隐式文件集,请指定basedir