【问题标题】:How can I exclude sources in a javac task in ant?如何在 ant 的 javac 任务中排除源?
【发布时间】:2010-06-30 01:44:28
【问题描述】:

我的 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/中的文件被此任务编译(但我确实希望${src.dir}/com/foo/bar/quux/ 下的所有其他内容将在此任务中编译)。

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

【问题讨论】:

    标签: java ant javac


    【解决方案1】:

    有几个人建议使用&lt;exclude&gt;。这不适用于我指定任务的方式。与the sixth example on this page 相关联的垃圾神回答让我了解了如何重组我的任务规范。

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

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

    我切换到使用带有路径的单个 &lt;src&gt;,然后使用一组 &lt;include&gt; 元素,如下所示:

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

    这似乎在功能上相同,但与 &lt;exclude&gt; 的使用兼容:

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

    (实际上,我很惊讶最初那里的东西完全有效。)

    【讨论】:

      【解决方案2】:

      根据我的实验,您不应包含要排除的文件的完整路径。 这个不行:

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

      但是这个可以:

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

      【讨论】:

        【解决方案3】:

        我不确定其余的,但 &lt;exclude/&gt; 嵌套元素应该在 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>
        

        【讨论】:

        • 除了额外的*,matiasf 也是这么说的。只是为了确保我无论如何都尝试过,但它不起作用。不过,您链接到的示例帮助我找出了可行的方法。
        • 是的,+1 给@matiasf。我还想证明&lt;exclude/&gt; 嵌套在javac 中,但不在&lt;src/&gt; 中。我在** 上添加了一个链接,因为我在需要的时候永远找不到它。 :-)
        【解决方案4】:

        试试

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

        【讨论】:

        • 不,这行不通。它仍然会尝试编译这些文件。
        【解决方案5】:

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

        如果 A.java 有对 B.java 的引用,并且您尝试排除 B.java,那么编译 A.java 将要求也编译 B.java。

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

        【讨论】:

          【解决方案6】:

          试试 {source.dir} 下的文件夹“test”不会被编译

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-02
            • 1970-01-01
            • 2012-09-20
            • 2015-06-18
            相关资源
            最近更新 更多