2010-06-30 13 views
15

Ho la seguente nel mio build.xml:Come posso escludere sorgenti in un task javac nella formica?

<target name="compile.baz" depends="init"> 
    <javac destdir="${build.dir}/classes" debug="on"> 
     <compilerarg value="-Xlint:deprecation"/> 
     <src> 
     <pathelement location="${src.dir}/com/foo/bar/baz/" /> 
     <pathelement location="${src.dir}/com/foo/bar/quux/" /> 
     <!-- Need to exclude ${src.dir}/com/foo/bar/quux/dontwant/ --> 
     </src> 
     <classpath refid="classpath.jars" /> 
    </javac> 
    ... 
</target> 

Questo in gran parte fa quello che voglio, se non che (come dice il commento) faccio non desidera che i file in
${src.dir}/com/foo/bar/quux/dontwant/ essere compilato da questo compito (ma voglio tutto il resto sotto ${src.dir}/com/foo/bar/quux/ da compilare in questa attività).

Sono un formicaio completo n00b e la documentazione non mi è stata di grande aiuto. Vedo diversi punti in cui si dice che ci sono vari elementi/attributi di esclusione/esclusione, ma ogni variazione a cui posso pensare non ha alcun effetto o si traduce in un errore come "blah non supporta l'attributo 'exclude'".

risposta

16

Un paio di persone hanno suggerito di utilizzare <exclude>. Questo non ha funzionato con il modo in cui è stato specificato il mio compito. risposta di trashgod collegata a the sixth example on this page che mi ha dato un'idea di come ristrutturare la mia specifica di attività.

Sembra che il mio problema fosse legato al modo in cui stavo specificando i file sorgente. Piuttosto che utilizzare <pathelement> elementi in una <src>, come questo:

<src> 
    <pathelement location="${src.dir}/com/foo/bar/baz/" /> 
    <pathelement location="${src.dir}/com/foo/bar/quux/" /> 
</src> 

sono passato ad usare un singolo <src> con un percorso e quindi un insieme di <include> elementi, in questo modo:

<src path="${src.dir}" /> 
<include name="com/foo/bar/baz/**" /> 
<include name="com/foo/bar/quux/**" /> 

Questo sembra funzionalmente identici, ma è compatibile con l'uso di <exclude>:

<exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/> 

(In realtà, sono sorpreso che ciò che era lì, in primo luogo ha funzionato affatto.)

+0

Sembra più familiare! – trashgod

4

Prova

<javac> 
(...> 
<exclude name="${src.dir}/com/foo/bar/quux/dontwant/*" /> 
(...) 
</javac> 
+1

No, non funziona. Cerca ancora di compilare quei file. –

+1

+1 per l'idea giusta originale. – trashgod

5

io non sono sicuro circa il resto, ma l'elemento nidificato <exclude/> dovrebbe funzionare nel compito Javac. Vedi il sesto example in basso.

Addendum: i modelli, inclusa la notazione **, sono discussi in Directory-based Tasks.

<target name="compile.baz" depends="init"> 
    <javac destdir="${build.dir}/classes" debug="on"> 
     <compilerarg value="-Xlint:deprecation"/> 
     <src> 
      <pathelement location="${src.dir}/com/foo/bar/baz/" /> 
      <pathelement location="${src.dir}/com/foo/bar/quux/" /> 
     </src> 
     <exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/> 
     ... 
    </javac> 
    ... 
</target> 
+0

A parte l'extra '*', è la stessa cosa che ha detto matiasf. Per essere sicuro di averlo provato lo stesso, ma non funziona. L'esempio che hai collegato mi ha aiutato a capire qualcosa che funziona, però. –

+0

Sì, +1 a @matiasf. Volevo anche mostrare che '' è nidificato in 'javac', ma non in' '. Ho aggiunto un link alla sezione su "**", perché non riesco mai a trovarlo quando ne ho bisogno. :-) – trashgod

1

provare cartella "test" sotto {source.dir} non sarebbe stato rispettato

<javac destdir="${compile.dir}" ...> 
    <src path="${source.dir}" /> 
    <exclude name="test/**"/> 
</javac> 
10

Dalle mie esperimenti non si dovrebbe includere percorso completo per il file che si desidera escludere. Questo non funziona:

<javac> 
(...> 
    <exclude name="${src.dir}/com/foo/blah/blah1/FILENAME.java"/> 
(...) 
</javac> 

ma questo fa:

<javac> 
(...> 
    <exclude name="com/foo/blah/blah1/FILENAME.java"/> 
(...) 
</javac> 
4

Se si sta tentando di escludere le classi Java, ma Ant sta ancora cercando di compilazione allora questo potrebbe essere dovuto a riferimenti a queste classi nel tuo codice.

Se A.java ha un riferimento a B.java e si tenta di escludere B.java, la compilazione di A.java richiede che anche B.java sia compilato.

Questa è una delle ragioni per le interfacce in Java, quindi è possibile compilare l'interfaccia senza dover compilare le implementazioni.

Problemi correlati