2013-07-12 176 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来管理你的构建的依赖关系。