Domanda

Dire che ho le mie fonti nel mio src / albero (e possibilmente nel mio test / albero). Supponiamo che vorrei compilare solo parte di quell'albero. I motivi per cui potrei volerlo fare sono vari. Come esempio, potrei voler creare il più piccolo jar possibile (senza includere determinate classi), oppure potrei volere il tempo di compilazione più veloce per quello che sto compilando. Voglio assolutamente compilare tutte le dipendenze, però!

Questo può essere facilmente ottenuto dalla riga di comando con:

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java

Ora, come puoi farlo con la formica? L'attività javac compila tutto :

  

La directory di origine e di destinazione   sarà scansionato ricorsivamente per Java   file sorgente da compilare.

Si possono usare i parametri excludes e includes, ma sono problematici per questo scopo. In effetti, sembra che si debba impostare esplicitamente tutto il javac (non la ricerca automatica delle dipendenze) e anche peggio che excluses ha la priorità su include :

  

Quando sono sia l'inclusione che l'esclusione   usato, solo file / directory che   abbina almeno una delle inclusioni   modelli e non corrispondono a nessuno del file   vengono utilizzati i modelli di esclusione.

Pertanto, non è possibile utilizzare

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  

Perché non compilerà nulla :-(

Esiste un modo per ottenere quella semplice riga di comando <=> con ant?


EDITED: Grazie per la tua risposta, Sadie, la sto accettando, perché funziona come mi chiedevo in questa domanda. Ma ho un paio di commenti (troppo a lungo per essere nel campo dei commenti della tua risposta):

1) Ho letto la documentazione (vedere i link sopra), ma non è chiaro che con solo <=> stai effettivamente escludendo tutto il resto

2) Quando hai appena <=> la formica registra qualcosa come

[javac] Compiling 1 source file to /my/path/to/build

anche se le dipendenze lo rendono compilare (molto) più di un solo file sorgente.

È stato utile?

Soluzione

Perché escludi e includi? Se hai almeno un'inclusione, i file vengono compilati solo se sono esplicitamente inclusi. Quindi dovrebbe funzionare:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />

O più flessibile:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>

Per includere solo determinati pacchetti o classi in un barattolo, utilizzare un attributo fileset

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>

Ancora una volta, è possibile utilizzare più inclusioni per combinare pacchetti separati. Sperimenta con include e leggi la documentazione e sei sicuro di trovare la risposta di cui hai bisogno.

Altri suggerimenti

Vecchia domanda, ma stavo lottando con lo stesso problema e ho trovato una soluzione più elegante. Quindi eccolo qui, per riferimento futuro:

Secondo i documenti di formica l'elemento <javac> è un <fileset> implicito e come tale può prendere Selettori come <filename name="**/MyClass.java"/>, quindi questo compilerebbe solo MyClass.java:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
  <filename name="**/path/to/MyClass.java"/>
</javac>

In realtà, solo controlla tutto, se esegui una compilazione due volte di seguito noterai che la seconda è molto più veloce. In realtà, può essere facilmente persuaso a perdere le cose.

Se non vuoi nemmeno che consideri tutto, dovrai scomporlo in moduli / progetti / alberi sorgente più piccoli in modo da dire esplicitamente alla formica cosa compilare.

Fornisci solo l'elenco separato da virgole dei file che desideri creare. Diciamo esempio

<property name="includeFileList" value="<name of java class>.java"/>

<javac srcdir="${src.dir}" destdir="${build.dir}"
       target="1.6" debug="true" includes="${includeFileList}"/>

Funzionerà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top