2017-08-01 24 views
1

我试图放弃使用notcontains关键字在我的Ant构建中的@WebService注释类。但是,它不起作用,仍然包含使用@WebService注解的类。下面是用于源复制到工作build目录任务:文件集包含一些文件但不是全部的选择器

<copy todir="${compile.dir}"> 
    <fileset dir="${src.dir}"> 
     <include name="**/*" /> 
     <exclude name="**/*.class" /> 
     <exclude name="log4j.properties" /> 
     <exclude name="log4j.properties.*" /> 
     <exclude name="log4j.xml" /> 
     <exclude name="log4j.xml.*" /> 
     <exclude name="*.jocl" /> 
     <not> 
      <contains text="@WebService(" casesensitive="true" /> 
     </not> 
    </fileset> 
</copy> 

然而,这似乎是not节被忽略,而这些类仍然被复制。为什么这不起作用?语法错了吗?另外,如何添加条件,以便限制仅涉及.java文件?我正在使用Apache Ant(TM) version 1.9.6 compiled on July 8 2015

+1

是'$ {compile.dir}'空每次运行前:

的选择容器,如果你喜欢能等效这样写? ''只会对任何它认为需要复制的文件采取操作,它不会删除它在之前的运行中复制的文件。 –

+0

它不是。愚蠢的我指望隐含的干净 –

回答

1

(也许这会引导你,这对我的作品,但我不能肯定我完全理解你的要求。)

试试这个文件集:

<fileset dir="${src.dir}"> 
    <exclude name="**/*.class" /> 
    <exclude name="log4j.properties" /> 
    <exclude name="log4j.properties.*" /> 
    <exclude name="log4j.xml" /> 
    <exclude name="log4j.xml.*" /> 
    <exclude name="*.jocl" /> 
    <or> 
    <filename name="**/*.java" negate="yes" /> 
    <not> 
     <contains text="@WebService(" casesensitive="true" /> 
    </not> 
    </or> 
</fileset> 

一很少有解释性意见:

没有必要指定<include name="**/*" />这是隐含在文件集中的。

当您在文件集(如<not>...<contains>...</not>)中包含嵌套的selector时,这与模式集(彼此隐式地进行OR操作)隐式相与。请参阅<fileset>文档:

选择器可用作FileSet中的嵌套元素。如果FileSet中的选择器的任何 未选择该文件,则文件 不被视为FileSet的一部分。这使FileSet对等 到<and>选择器容器。

这样做的结果是您需要使用带有两个负选择器的<or>选择器容器。换句话说,“选择文件,如果它的不是一个java文件或它匹配文本字符串”

<or> 
    <not> 
    <filename name="**/*.java" /> 
    </not> 
    <not> 
    <contains text="@WebService(" casesensitive="true" /> 
    </not> 
</or> 
相关问题