2013-07-12 11 views
7

considerare frammento build.xml minimale che si basa vaso da fonti e include tutte le risorse non-Java:formica più directory di origine con risorse copiati

<property name="src.dir" value="src" /> 

<target name="build"> 
    <javac destdir="bin"> 
     <src path="${src.dir}" /> 
    </javac> 
    <copy includeemptydirs="false" todir="bin"> 
     <fileset dir="${src.dir}"> 
      <exclude name="**/*.java" /> 
     </fileset> 
    </copy> 
    <jar destfile="dist/foo.jar" basedir="bin"/> 
</target> 

Ora immaginate che ho bisogno di sostenere una lista di directory di origine:

<property name="src.dirs" value="src;src-gen" /> 

Come posso modificare lo script sopra per farlo accadere? javac prenderà felicemente l'elenco delle directory ma per la copia ho bisogno di trasformare una stringa in un elenco di set di file con esclusioni o trovare un altro modo.

risposta

3

non sono sicuro di un modo per farlo con built-in attività Ant, ma si potrebbe usare un ant-contrib <for> task

<path id="src.path"> 
    <pathelement location="src" /> 
    <pathelement location="src-gen" /> 
</path> 

<target name="build"> 
    <javac destdir="bin"> 
     <src refid="src.path" /> 
    </javac> 
    <for param="dir"> 
     <path refid="src.path" /> 
     <sequential> 
      <copy includeemptydirs="false" todir="bin"> 
       <fileset dir="@{dir}"> 
        <exclude name="**/*.java" /> 
       </fileset> 
      </copy> 
     </sequential> 
    </for> 
    <jar destfile="dist/foo.jar" basedir="bin"/> 
</target> 
+0

Questo è quello che ho finito, anche se non consente la creazione di una risorsa "composita" che potrebbe essere riutilizzata per riferimento. –

+0

Vale anche la pena considerare un esempio su come creare il percorso dall'elenco delle directory con '' alla fine di https://ant.apache.org/manual/Tasks/script.html –

8

Normalmente, è sufficiente elencarli tutti insieme:

<javac destdir="bin"> 
    <src path="${src.dir}"/> 
    <src path="${src2.dir}"/> 
    <src path="${src3.dir}"/> 
</javac> 

si può provare l'attributo <sourcepath/>. Non ho mai usato, ma credo che si può utilizzare per definire un percorso di vari file di origine, e l'uso che:

<path id="source.path"> 
    <pathelement path="${src.dir}"/> 
    <pathelement path="${src2.dir}"/> 
    <pathelement path="${src4.dir}"/> 
</path> 

<javac destdir="bin"> 
    srcpathref="source.path"/> 

La prima opera volontà, ma non al 100% sicuro circa la seconda.

+0

Come ho detto 'javac' è facile poiché accetterà direttamente la lista. Il mio problema è con il compito 'copia'. –

4

La soluzione più semplice consiste nello specificare solo più serie di file, nello stesso modo come il compito javac supporta più "src" attributi:

<target name="build" depends="init" description="Create the package"> 
     <javac destdir="${classes.dir}" includeantruntime="false"> 
     <src path="src/main1/java"/> 
     <src path="src/main2/java"/> 
     </javac> 

     <copy todir="${classes.dir}" includeemptydirs="false"> 
     <fileset dir="src/main1" excludes="**/*.java"/> 
     <fileset dir="src/main2" excludes="**/*.java"/> 
     <flattenmapper/> 
     </copy> 
    </target> 

Questo ovviamente presuppone che il numero di posizioni di codice sorgente è fisso, che non è irragionevole aspettarsi.

Se si vuole guidare questo utilizzando una proprietà lista è necessario ricorrere a incorporare uno script all'interno del vostro accumulo per elaborare questa lista (che non posso avallare ant-contrib):

<project name="demo" default="build"> 

    <property name="src.dirs" value="src/main1,src/main2"/> 
    <property name="build.dir" location="build"/> 
    <property name="classes.dir" location="${build.dir}/classes"/> 

    <target name="bootstrap"> 
     <mkdir dir="${user.home}/.ant/lib"/> 
     <get dest="${user.home}/.ant/lib/groovy-all.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.6/groovy-all-2.1.6.jar"/> 
    </target> 

    <target name="init"> 
     <mkdir dir="${classes.dir}"/> 
    </target> 

    <target name="build" depends="init" description="Create the package"> 
     <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/> 

     <groovy> 
     def srcDirs = properties["src.dirs"].split(",") 

     ant.javac(destdir:properties["classes.dir"], includeantruntime:false) { 
      srcDirs.each { 
       src(path:"${it}/java") 
      } 
     } 

     ant.copy(todir:properties["classes.dir"], includeemptydirs:false) { 
      srcDirs.each { 
       fileset(dir:it, excludes:"**/*.java") 
      } 
      flattenmapper() 
     } 
     </groovy> 
    </target> 

    <target name="clean" description="Cleanup build dirs"> 
     <delete dir="${build.dir}"/> 
    </target> 

</project> 

Note:

  • Confronta i target "build". Noterai che la soluzione groovy chiama ANT allo stesso modo. Questo è il motivo per cui mi piace molto l'integrazione di groovy con ANT.
  • L'esempio include anche un target "bootstrap" per scaricare la dipendenza di groovy jar da Maven Central. In alternativa puoi usare edera per gestire le dipendenze della tua build.