2017-08-01 2 views
1

Ich versuche, @WebService annotierte Klassen in meinem Ant-Build mit not und contains Schlüsselwörter zu verwerfen. Es funktioniert jedoch nicht und enthält weiterhin Klassen, die mit @WebService kommentiert sind. Hier ist die Aufgabe verwendeten Quellen in das Arbeits Build-Verzeichnis zu kopieren:Fileset mit enthält Selektor für einige Dateien, aber nicht alle

<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> 

Jedoch scheint es, wie der not Abschnitt wird ignoriert, und die Klassen sind noch kopiert. Warum funktioniert das nicht? Ist die Syntax falsch? Außerdem, wie füge ich eine Bedingung hinzu, so dass die Einschränkung betrifft nur .java Dateien?

Ich benutze Apache Ant(TM) version 1.9.6 compiled on July 8 2015.

+1

Ist '$ {compile.dir}' leer vor jedem Lauf? '' wird nur Maßnahmen ergreifen für alle Dateien, die es als Kopie benötigt, es wird nicht eine Datei entfernen, die es in einem vorherigen Lauf kopiert wurde. –

+0

Es war nicht. Dumm, dass ich auf implizite Sauberkeit zähle –

Antwort

1

(Vielleicht führt Sie, es funktioniert für mich, aber ich bin mir nicht ganz sicher, ob ich völlig Ihrer Anforderung verstanden habe.)

dieses fileset Versuchen:

<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> 

A Einige erläuternde Kommentare:

Sie müssen <include name="**/*" /> nicht angeben, dies ist implizit in einer Dateigruppe.

Wenn Sie ein verschachteltes selector in eine Dateigruppe einfügen (wie <not>...<contains>...</not>), wird dies implizit mit den Patternsets verknüpft (die implizit ODER-verknüpft sind). Siehe <fileset> Dokumentation:

Selektoren sind als verschachtelte Elemente im FileSet verfügbar. Wenn der Selektoren innerhalb des FileSet die Datei nicht auswählen, wird die Datei nicht als Teil des FileSet betrachtet. Dies macht ein FileSet-Äquivalent zu einem <and> Selektor-Container.

Das Ergebnis davon ist, dass Sie einen Selector-Container <or> mit zwei negativen Selektoren verwenden müssen. Mit anderen Worten, "wählen Sie die Datei, wenn es ist nicht eine Java-Datei ODER es nicht übereinstimmen mit der Textzeichenfolge".

Der Behälter Wähler könnte in äquivalenter Weise auf diese Weise geschrieben werden, wenn Sie es vorziehen:

<or> 
    <not> 
    <filename name="**/*.java" /> 
    </not> 
    <not> 
    <contains text="@WebService(" casesensitive="true" /> 
    </not> 
</or> 
Verwandte Themen