2010-03-11 56 views
1

如何获取javac任务以使用现有文件集?在我的build.xml中,我已经创建了多个文件集,以便在整个构建文件的多个位置使用。这里是他们如何定义:如何传递源代码列表以编译为javac任务?

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

p.p.s.对不起,大喊大叫,但有些人太快发表回复,没有解决这个问题。

+0

我有几个直接回复。有人说在文件列表中使用refid。这样做的确允许将参考传递给javadoc中的标签,而不是示例中使用的扩展参考。但它并没有解决问题,因为javadoc仍然拒绝filelist作为invallid。 另一个人建议将其更改为文件集并将其包装在src标记中。这允许使用文件集和refid,但是src想要一个目录列表,并且我有一个文件列表。 – 2010-03-11 16:52:45

回答

1

如果我正确理解你的问题,那么antcallpathconvert任务的组合应该可以做到。

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目标与在${src} DIR产量文件

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

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

谢谢,pathconvert是解决方案。 – 2010-03-13 10:38:22

0

谢谢! 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将引用转换为分号分隔的列表。