2010-06-30 59 views
15

我在我的build.xml如下:如何排除ant中的javac任務中的源代碼?

<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不支持」排除「屬性。

回答

16

有幾個人建議使用<exclude>。這不符合我的任務指定的方式。 trashgod的回答與the sixth example on this page有關,它給了我一個關於如何重構我的任務規範的想法。

看起來我的問題與我指定源文件的方式有關。而不是使用在<src><pathelement>元件,這樣:

<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/**"/> 

(其實,我很驚訝,是什麼在第一個地方是那裏所有的工作。)

+0

看起來更熟悉! – trashgod 2010-06-30 15:12:41

4

嘗試

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

不,那不行。它仍然試圖編譯這些文件。 – 2010-06-30 02:48:39

+1

+1爲原始正確的想法。 – trashgod 2010-06-30 15:16:29

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

除了額外的'*',這與matiasf所說的一樣。只是爲了確定我嘗試了它,但它不起作用。 雖然,您鏈接的示例幫助我找出了可行的方法。 – 2010-06-30 05:29:21

+0

是的,+1 to @matiasf。我還希望顯示''嵌套在'javac'中,但不嵌入''中。我在'**'部分添加了一個鏈接,因爲當我需要它時我永遠找不到它。 :-) – trashgod 2010-06-30 15:24:44

1

嘗試 文件夾「測試」 {source.dir}下不會被遵守

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

從我的實驗,你不應該包括您要排除的文件的完整路徑。 這一個不工作:

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

但這一個作用:

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

如果你想排除的Java類,但螞蟻仍試圖編譯他們然後這可能是由於您的代碼中對這些類的引用。

如果A.java引用了B.java並且嘗試排除B.java,那麼編譯A.java將需要編譯B.java。

這是Java中接口的一個原因,因此您可以在不需要編譯實現的情況下編譯接口。

相關問題