我如何将源代码清单编译成javac任务?

我怎样才能让javac任务使用现有的文件集? 在我的build.xml中,我已经创建了多个文件集,以便在整个构建文件的多个位置使用。 以下是他们的定义:

<fileset dir = "${src}"  
    id       = "java.source.all">  
 <include name =  "**/*.java" />  
</fileset>  

<fileset dir = "${src}"  
    id       = "java.source.examples">  
  <include name = "**/Examples/**/*.java" />  
</fileset>  

<fileset dir = "${src}"  
    id       = "java.source.tests">  
  <include name = "**/Tests/*.java" />
</fileset>

<fileset dir = "${src}"
    id       = "java.source.project">
  <include name = "**/*.java"             />
  <exclude name = "**/Examples/**/*.java" />
  <exclude name = "**/Tests/**/*.java"    />
</fileset>

我也使用macrodef来编译java文件,所以javac任务不需要重复多次。 宏看起来像这样:

<macrodef name="compile">
  <attribute name="sourceref"/>
  <sequential>
    <javac srcdir         = "${src}"
        destdir           = "${build}"
        classpathref      = "classpath"
        includeantruntime = "no"
        debug             = "${debug}">
      <filelist dir="." files="@{sourceref}" />  <-- email is about this
   </javac>
 </sequential>

我想要做的只是编译特定目标所需的类而不是源树中的所有目标。 而且不必每次都指定文件。 以下是目标定义的方式:

<target name = "compile-examples"
    depends  = "init">
  <compile sourceref = "${toString:java.source.examples}" />
</target>

<target name = "compile-project"
    depends  = "init">
  <compile sourceref = "${toString:java.source.project}" />
</target>

<target name = "compile-tests"
    depends  = "init">
  <compile sourceref = "${toString:java.source.tests}" />
</target>

正如你所看到的,每个目标都将java文件指定为绝对文件名的一个西西冒号分隔列表。 唯一的问题是,javac不支持filelist。 它也不支持文件集,路径或路径集。 我试过使用,但它将列表视为单个文件名。 我尝试的另一件事是直接发送引用(不使用toString)并使用但包含没有ref属性。

所以问题是:如何获得javac任务以使用在构建文件的另一部分中定义的文件集的引用? 我对那些导致我有多个javac任务的解决方案不感兴趣。 完全重写宏是可以接受的。 如果目标间的冗余代码保持在最低限度,那么对目标的更改也是可以接受的。

ps另一个问题是文件集想要逗号分隔列表。 我只是简单地搜索了一种将分号转换为逗号的方法,并没有找到办法做到这一点。

pps对不起,大声喊叫,但有些人太快,无法发布不涉及该主题的回复。


如果我正确理解你的问题,那么antcall和pathconvert任务的组合应该能够做到。

Pathconvert可用于在包含的文件列表中执行逗号分隔。 (我不明白你提到的分号问题是什么,但你可以调整pathconvert调用来解决这个问题。)在宏中使用antcall允许你在每个编译时传递不同的文件集引用id。

这里有一个例子说明:

<fileset id="file.set1" dir="." includes="TestT*.java" />
<fileset id="file.set2" dir="." includes="TestF*.java" />

<macrodef name="compile">
  <attribute name="sourceref"/>
  <sequential>
    <antcall target="compile_inner">
      <reference refid="@{sourceref}" torefid="inner.file.set" />
    </antcall>
  </sequential>
</macrodef>

<target name="comp">
  <compile sourceref="file.set1" />
  <compile sourceref="file.set2" />
</target>

<target name="compile_inner">
  <pathconvert pathsep=" " property="file.list" refid="inner.file.set">
    <map from="${basedir}/" to="" />
  </pathconvert>
  <javac srcdir         = "${src}"
      destdir           = "${build}"
      includeantruntime = "no"
      includes          = "${file.list}"
      debug             = "${debug}"
      listfiles         = "yes">
  </javac>
</target>

用文件运行comp目标

TestFive.java TestFour.java TestOne.java TestSix.java TestThree.java TestTwo.java

${src}目录中得到:

comp:

compile_inner:
    [javac] Compiling 2 source files to /Users/mc/stack_overflow/ant/javac
    [javac] /Users/mc/stack_overflow/ant/javac/TestThree.java
    [javac] /Users/mc/stack_overflow/ant/javac/TestTwo.java

compile_inner:
    [javac] Compiling 2 source files to /Users/mc/stack_overflow/ant/javac
    [javac] /Users/mc/stack_overflow/ant/javac/TestFive.java
    [javac] /Users/mc/stack_overflow/ant/javac/TestFour.java

BUILD SUCCESSFUL

谢谢! PathConvert解决了这个问题。 将宏体更改为此可以将文件列表传入:

<sequential>
  <local name = "sources" />
  <pathconvert refid = "@{sourceref}"
      property       = "sources"
      pathsep        = "," />
  <javac srcdir         = "${src}"
      destdir           = "${build}"
      classpathref      = "classpath"
      includes          = "${sources}"
      includeantruntime = "no"
      debug             = "${debug}" />
</sequential>  

有了这个,我也可以在宏调用中删除toString并直接传递参考。 请注意,toString将引用转换为分号分隔的列表。


也许它有时更容易地使用特定的目录属性,然后一个patternset其中“组”包含/排除。 然后,可以使用相同的patternset通过refid如-在多个任务javacjavadoc

<patternset id="source_patterns">
    <include name="**/*.java"/>
    <exclude name="excluded_path/*.java" unless="some_prop"/>
</patternset>

<target name="compile">
    <javac srcdir="${sources_dir}">
       <patternset refid="source_patterns"/>
    </javac>
</target>

<target name="doc">
    <javadoc ...>
       <fileset dir="${sources_dir}">
           <patternset refid="source_patterns"/>
       </fileset>
    </javadoc>
</target>
链接地址: http://www.djcxy.com/p/60365.html

上一篇: How can I pass a list of sources to compile to the javac task?

下一篇: How do I create an EAR file with an ant build including certain files?