ant使用复制的资源创建多个源目录

ant使用复制的资源创建多个源目录,ant,Ant,考虑最小build.xml片段,它从源代码构建jar并包括所有非java资源: <property name="src.dir" value="src" /> <target name="build"> <javac destdir="bin"> <src path="${src.dir}" /> </javac> <copy includeemptydirs="false" todir=

考虑最小build.xml片段,它从源代码构建jar并包括所有非java资源:

<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
很乐意获取目录列表,但为了复制,我需要将字符串转换为包含排除项的文件集列表,或者找到其他方法。

通常,您只需将它们全部列出:

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

您可以尝试使用
属性。我从未使用过它,但我相信您可以使用它定义各种源文件的路径,并使用它:

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

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

srcpathref=“source.path”/>

第一个可以工作,但第二个不能100%确定。

我不确定如何使用内置的Ant任务来完成,但您可以使用


简单的解决方案是只指定多个文件集,就像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>

当然,这假设源代码位置的数量是固定的,这并不是不合理的

如果要使用列表属性驱动此操作,则必须在生成中嵌入脚本以处理此列表(我不能认可ant contrib):


def srcDirs=属性[“src.dirs”].split(“,”)
javac(destdir:properties[“classes.dir”],includeantruntime:false){
srcDirs.each{
src(路径:“${it}/java”)
}
}
复制(todir:properties[“classes.dir”],includeemptydirs:false){
srcDirs.each{
文件集(dir:it,不包括:“***.java”)
}
平面映射器()
}
注:

  • 比较“构建”目标。您会注意到groovy解决方案以相同的方式调用ANT。这就是为什么我非常喜欢groovy与ANT的集成
  • 该示例还包括一个“引导”目标,用于从中下载GroovyJAR依赖项。您也可以使用ivy来管理构建的依赖项

    • 一个没有ant contrib任务或嵌入式脚本的简单解决方案:

      <property name="src.dirs" value="src,src-gen" />
      
      <path id="src.path">
          <multirootfileset type="dir" basedirs="${src.dirs}"/>
      </path>
      
      <target name="build">
          <javac destdir="bin">
              <src refid="src.path"/>
          </javac>
          <copy todir="bin">
              <multirootfileset type="file" basedirs="${src.dirs}">
                  <exclude name="**/*.java"/>
              </multirootfileset>
          </copy>
          <jar destfile="dist/foo.jar" basedir="bin"/>
      </target>
      
      
      

      MultiRootFile集用于救援!;-)需要Ant 1.9.4或更高版本。

      正如我提到的
      javac
      很容易,因为它将直接接受列表。我的问题是
      copy
      task。第二种方法是,在javac中使用path,使用它是我最后要做的,尽管它不允许创建可以通过引用重用的“复合”资源。另外值得考虑的是一个示例,如何使用
      
      
      <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>
      
      <property name="src.dirs" value="src,src-gen" />
      
      <path id="src.path">
          <multirootfileset type="dir" basedirs="${src.dirs}"/>
      </path>
      
      <target name="build">
          <javac destdir="bin">
              <src refid="src.path"/>
          </javac>
          <copy todir="bin">
              <multirootfileset type="file" basedirs="${src.dirs}">
                  <exclude name="**/*.java"/>
              </multirootfileset>
          </copy>
          <jar destfile="dist/foo.jar" basedir="bin"/>
      </target>