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

使用标准的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手册页面,

此任务形成一个隐式FileSet,并支持<fileset>(dir变成basedir)以及嵌套的<include> ,<exclude>和<patternset>元素的大多数属性。

所以理论上,不应该只<include>一个<include> ,而应该成为宏的<jar>的嵌套元素?

显然,在实践中这不是问题(我们在构建文件中打了一个bigass注释,告诉人们不要忽略显式的<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问题。 要使用隐式文件集,必须为<jar>任务指定basedir属性。 这里有一个例子说明了这一点:

<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

链接地址: http://www.djcxy.com/p/60375.html

上一篇: macrodef'd <jar> task not behaving like an implicit fileset?

下一篇: Ant: Using a fileset with the javac task