如何让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不支持文件列表。它也不支持文件集,路径或路径集。我尝试过使用但它将列表视为单个文件名。我尝试的另一件事是直接发送引用(不使用toString)并使用但是include没有ref属性。
问题是:如何使用javac任务来引用在构建文件的另一部分中定义的文件集?我对导致我有多个javac任务的解决方案不感兴趣。完全重写宏是可以接受的。如果目标之间的冗余代码保持最小,则对目标的更改也是可接受的。
P.S。另一个问题是fileset想要一个以逗号分隔的列表。我只是简单地搜索了将分号转换为逗号的方法,并且没有找到办法。
p.p.s。对于大喊大叫感到抱歉,但有些人太快发布不能解决问题的回复。
答案 0 :(得分:1)
如果我正确理解了您的问题,那么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
<{1>}目录中的:
${src}
答案 1 :(得分: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将引用转换为以分号分隔的列表。
答案 2 :(得分:0)
也许它有时更容易使用特定目录的属性,然后是patternset
哪个&#34;组&#34;包含/排除。然后,可以在更多任务中使用相同的patternset
通过refid
- 例如javac
或javadoc
。
<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>