2013-07-12 4 views
7

rozpatrywanymi w ocenie środków build.xml minimalny fragment, który buduje słoik ze źródeł i obejmuje wszystkie zasoby non-Java:ant wiele katalogów źródłowych z kopiowanych zasobów

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

Teraz wyobraź sobie, że muszę wesprzeć listę katalogów źródłowych:

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

Jak mogę zmienić powyższy skrypt, aby tak się stało? javac Z radością wykonam listę katalogów, ale dla kopii muszę przekształcić ciąg na listę zestawów plików z wykluczeniami lub znaleźć inny sposób.

Odpowiedz

3

nie jestem pewien sposób to zrobić z wbudowanym zadań Ant ale można użyć 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

Tak właśnie zrobiłem, chociaż nie pozwala to na stworzenie "złożonego" zasobu, który mógłby zostać ponownie użyty przez odniesienie. –

+0

Warto również zastanowić się, jak utworzyć ścieżkę z listy katalogów z '' na końcu https://ant.apache.org/manual/Tasks/script.html –

8

Normalnie, po prostu wymienić je wszystkie razem:

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

Można spróbować atrybut <sourcepath/>. Nigdy nie używałem go, ale wierzę, że można go użyć do określenia ścieżki różnych plików źródłowych, i użyć jej:

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

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

Pierwsza praca będzie, ale nie w 100% pewien co do sekundy.

+0

Jak już wspomniałem, 'javac' jest łatwe, ponieważ akceptuje listę bezpośrednio. Mój problem dotyczy zadania 'copy'. –

4

Prostym rozwiązaniem jest po prostu określić wiele zestawów plików, w taki sam sposób jak zadanie javac obsługuje wiele „src” atrybuty:

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

to oczywiście zakłada, że ​​liczba miejsc kod źródłowy jest stała, która nie jest nierozsądne oczekiwać.

Jeśli chcesz prowadzić ten używając własności list trzeba uciekać się do osadzania w ciągu swojej kompilacji skryptu do przetworzenia tej listy (nie mogę poprzeć 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> 

Uwagi:

  • Porównaj cele "kompilacji". Zauważysz, że świetne rozwiązanie nazywa ANT w ten sam sposób. Właśnie dlatego bardzo lubię integrację groovy z ANT.
  • Przykład zawiera również element docelowy "ładowanie początkowe", który umożliwia pobranie uzależnienia od złośliwego słoja od Maven Central. Alternatywnie możesz użyć bluszcza do zarządzania zależnościami kompilacji.