棘手的Ant文件集(包括大多数,但不是全部目录)

时间:2009-06-19 14:22:14

标签: ant

我有一个案例,我无法弄清楚如何让Ant只在文件集中提取我想要的文件(为什么地球上没有Ant人只使用正则表达式?)。

这是情况。我在classes目录下有一堆类。我想要:

1)课程下的所有文件,

2)但不是/ com / foo / bar下的那些

3)除了我确实需要/com/foo/bar/AbstractCustomerAdapter.class和CustomerAdapterFactory.class。

/ com / foo / bar下的文件通常被命名为FooCustomerAdapter.class。

简而言之,我们创建了2个罐子,其中一个仅包含客户特定的adpaters,另一个包含其他所有商品。这允许我们创建一个新的客户适配器并换掉那个迷你jar。上面那个杀了我的文件集就是“其他一切”。

一旦Ant排除了一个文件,没有包含会把它带回来,因此第2项和第2项3让我心烦如何做文件集。如何排除所有客户适配器,而不是排除抽象客户适配器?我没有蚂蚁兼容的通配符可以排除XZYCustomerAdapter类而不排除AbstractCustomerAdapter。

好吧,至少我找不到一个,但希望你们中的一个Stack Overflow居民比我更聪明:)

3 个答案:

答案 0 :(得分:45)

接受单个文件集的大多数任务也可以接受多个文件集。

<jar file="...">
  <fileset dir="classes">
    <exclude name="com/foo/bar/**"/>
  </fileset>

  <fileset dir="classes">
    <include name="com/foo/bar/AbstractCustomerAdapter.class"/>
    <include name="com/foo/bar/CustomerAdapterFactory.class"/>
  </fileset>
</jar>

答案 1 :(得分:1)

我在不同的地方做了两件不同的事情。有时我会将文件复制到临时位置,因此我可以在一个步骤中包含所有可能的内容,并在后续步骤中排除某些特定项目。其他时候,我使用两个单独的陈述。

您似乎不需要临时文件,但为了在构建安装之前将某些文本文件转换为PC行结束,我复制并转换与临时目录相关的所有内容(使用fixcrlf),然后选择并从创建的层次结构中选择不同平台的文件。

构建tar文件时,似乎可以在一行中包含特定文件,并在包含其他文件的后续行中排除该模式。

<tarfileset dir="classes" includes="classes" excludes="classes/com/foo/bar" />
<tarfileset dir="classes" includes="classes/com/foo/bar/AbstractCustomerAdapter.class,classes/com/foo/bar/CustomerAdapterFactory.class" />

如果Jar文件的构造不像tar和zip文件那样,您可能需要像修复crlf一样显式构建文件层次结构,并在更正的层次结构的第二次传递中构建jar文件。

答案 2 :(得分:0)

写一个custom selector。 api易于实现。在那里,您需要掌握所有Java的强大功能。