java - 如何将要编译的源列表传递给 javac 任务?

标签 java compiler-construction ant

如何让 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 任务的解决方案不感兴趣。完全重写宏是可以接受的。只要目标之间的冗余代码保持在最低限度,对目标的更改也是可以接受的。

附:另一个问题是文件集需要一个逗号分隔的列表。我只是简单地搜索了一种将分号转换为逗号的方法,但还没有找到一种方法。

p.p.s。抱歉,我大喊大叫,但有些人太快了,无法发表与主题无关的回复。

最佳答案

如果我正确理解你的问题,那么 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

关于java - 如何将要编译的源列表传递给 javac 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422435/

相关文章:

java - JMS 中的批处理/批量处理

java - 使用 geonames api 获取所有城镇/村庄名称

java - ant中如何让idlj编译idl文件

java - com/googlecode/flyway/ant/antlib.xml。找不到

java - 在Java中加载和显示HTML+CSS

java - WindowBuilder - 从 Main 打开 JFrame

compiler-construction - 尝试编写 LLVM 后端。没有好的教程可用

c++ - 查看编译器扩展代码 - C++

c++ - 可以读取目标文件吗?

java - 通过Ant脚本在java中加载环境变量