2013-07-12 362 views
7

考慮其來源建立罐子,包括所有的非Java資源最少的build.xml片斷:螞蟻多個源目錄複製與資源

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

現在想象一下,我需要支持的源目錄的列表:

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

如何修改上述腳本以使其發生? javac將愉快地獲取目錄列表,但爲了複製,我需要將字符串轉換爲帶有排除項的文件集列表或找到其他方法。

回答

3

我不知道的一種方式做到這一點的內置Ant任務,但你可以使用一個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

這就是我最終做的,雖然它不允許創建可以通過引用重用的「複合」資源。 –

+0

另外值得一提的是如何在https://ant.apache.org/manual/Tasks/script.html末尾使用''來創建目錄列表的路徑 –

8

通常情況下,你只需列出它們放在一起:

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

你可以嘗試<sourcepath/>屬性。我從來沒有使用過它,但我相信你可以用它來定義不同的源文件的路徑,並使用:

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

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

首先將工作,但不是100%地肯定了第二位。

+0

正如我所提到的'javac'很容易,因爲它會直接接受列表。我的問題是'copy'任務。 –

4

簡單的解決方法就是指定多個文件集,在相同的方式, javac任務支持多個「SRC」屬性:這當然

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

假定源代碼位置的數量是固定的,這是不不合理的期望。

如果你想推動這個使用必須求助於您的構建中嵌入腳本來處理這個列表中的列表屬性(我不能贊同螞蟻的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> 

注:

  • 比較「構建」目標。您會注意到groovy解決方案以相同的方式調用ANT。這就是爲什麼我非常喜歡groovy與ANT的整合。
  • 示例還包含一個「bootstrap」目標,用於從Maven Central下載Groovy jar依賴項。你也可以用ivy來管理你的構建的依賴關係。