如何在ant中的javac任务中排除源?

时间:2010-06-30 01:44:28

标签: java ant javac

我的build.xml中有以下内容:

<target name="compile.baz" depends="init">
   <javac destdir="${build.dir}/classes" debug="on">
      <compilerarg value="-Xlint:deprecation"/>
      <src>
         <pathelement location="${src.dir}/com/foo/bar/baz/" />
         <pathelement location="${src.dir}/com/foo/bar/quux/" />
         <!-- Need to exclude ${src.dir}/com/foo/bar/quux/dontwant/ -->
      </src>
      <classpath refid="classpath.jars" />
   </javac>
   ...
</target>

这主要做我想要的,除了(如评论所说)我想要文件在  ${src.dir}/com/foo/bar/quux/dontwant/由此任务编译(但我确实希望<{1}}下的其他所有在此任务中编译。)

我是一个完整的蚂蚁n00b,文档对我没什么帮助。我看到有几个地方,它说有各种排除/排除元素/属性,但我能想到的每个变体都没有效果或导致错误,如“ blah 不支持'排除'属性'。

6 个答案:

答案 0 :(得分:16)

有几个人建议使用<exclude>。这不符合我的任务指定方式。 trashgod的回答链接到the sixth example on this page,这让我了解了如何重构我的任务规范。

看起来我的问题与我指定源文件的方式有关。而不是在<pathelement>中使用<src>元素,如下所示:

<src>
   <pathelement location="${src.dir}/com/foo/bar/baz/" />
   <pathelement location="${src.dir}/com/foo/bar/quux/" />
</src>

我转而使用带有路径的单个<src>,然后使用一组<include>元素,如下所示:

<src path="${src.dir}" />
<include name="com/foo/bar/baz/**" />
<include name="com/foo/bar/quux/**" />

这似乎功能相同,但与<exclude>

的使用兼容
<exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/>

(实际上,我很惊讶,首先在那里工作的是什么。)

答案 1 :(得分:10)

从我的实验中,您不应该包含要排除的文件的完整路径。 这个不起作用:

<javac>
(...>
   <exclude name="${src.dir}/com/foo/blah/blah1/FILENAME.java"/>
(...)
</javac>

但是这个确实:

<javac>
(...>
   <exclude name="com/foo/blah/blah1/FILENAME.java"/>
(...)
</javac>

答案 2 :(得分:5)

尝试

<javac>
(...>
<exclude name="${src.dir}/com/foo/bar/quux/dontwant/*" />
(...)
</javac>

答案 3 :(得分:5)

我不确定其余内容,但<exclude/>嵌套元素应该在Javac任务中有效。请参见第六个example

附录:Directory-based Tasks中讨论了包括**符号在内的模式。

<target name="compile.baz" depends="init">
    <javac destdir="${build.dir}/classes" debug="on">
        <compilerarg value="-Xlint:deprecation"/>
        <src>
            <pathelement location="${src.dir}/com/foo/bar/baz/" />
            <pathelement location="${src.dir}/com/foo/bar/quux/" />
        </src>
        <exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/>
        ...
    </javac>
    ...
</target>

答案 4 :(得分:4)

如果您尝试排除Java类但Ant仍在尝试编译它们,那么这可能是由于您的代码中引用了这些类。

如果A.java有对B.java的引用并且你试图排除B.java,那么编译A.java也需要编译B.java。

这是Java中接口的一个原因,因此您可以编译接口而无需编译实现。

答案 5 :(得分:1)

{source.dir}下的文件夹“test”将无法完成

<javac destdir="${compile.dir}"  ...>
   <src path="${source.dir}" />
   <exclude name="test/**"/>
</javac>