2010-06-30 12 views
15

Mam następujących w moim build.xml:Jak wykluczyć źródła z zadania javac na ant?

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

to przeważnie robi to, co chcę, oprócz tego, że (jako komentarz mówi) zrobić nie chcą pliki w
${src.dir}/com/foo/bar/quux/dontwant/ być zestawiane przez to zadanie (ale chcę, aby wszystko inne pod ${src.dir}/com/foo/bar/quux/ zostanie skompilowane w tym zadaniu).

Jestem kompletnym ant n00b, a dokumentacja nie była dla mnie zbyt pomocna. Widzę kilka miejsc, w których jest napisane, że istnieją różne wykluczające/wykluczające elementy/atrybuty, ale każda odmiana, o której myślę, albo nie ma żadnego skutku, albo powoduje błąd w rodzaju "bla nie obsługuje atrybutu" wyklucz ".

Odpowiedz

16

Kilka osób zasugerowało użycie <exclude>. Nie zadziałało to w sposobie określania mojego zadania. Odpowiedź Trashgoda połączona z the sixth example on this page, która dała mi pomysł na restrukturyzację mojej specyfikacji zadania.

Wygląda na to, że mój problem był związany ze sposobem, w jaki określałem pliki źródłowe. Zamiast używać <pathelement> elementów w <src> w następujący sposób:

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

że przełącza się za pomocą jednego <src> ze ścieżką, a następnie zestaw <include> elementów, na przykład:

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

Wydaje się być funkcjonalnie identyczne, ale jest kompatybilny z użyciem <exclude>:

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

(Faktycznie, jestem zaskoczony, że to, co było na pierwszym miejscu pracował w ogóle).

+0

To wygląda lepiej! – trashgod

4

Spróbuj

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

Nie, to nie działa. Nadal próbuje skompilować te pliki. –

+1

+1 za oryginalny dobry pomysł. – trashgod

5

nie jestem pewien co do reszty, ale zagnieżdżone elementem <exclude/> powinien pracować w zadaniu Javac. Zobacz szósty example w dół.

Dodatek: Wzory, w tym notacja **, omówiono w artykule 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

Oprócz dodatkowego "*", to samo powiedzieli Matiasf. Dla pewności jednak spróbowałem, ale to nie działa. Przykład, który łączyłeś, pomógł mi znaleźć coś, co działa. –

+0

Tak, +1 do @matiasf. Chciałem również pokazać, że '' jest zagnieżdżony w 'javac', ale nie w' '. Dodałem link do sekcji o '**', ponieważ nie mogę jej znaleźć, kiedy jej potrzebuję. :-) – trashgod

1

spróbować folderu „test” pod {source.dir} nie byłyby spełnione

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

Z moich doświadczeń nie powinna zawierać pełna ścieżka do pliku, który chcesz wykluczyć. Ten jeden nie działa:

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

ale to się robi:

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

Jeśli chcesz wykluczyć klas Javy ale Ant wciąż próbuje skompilować ich to może być spowodowane odniesieniami do tych klas w twoim kodzie.

Jeśli Ajava ma odniesienie do B.java i próbujesz wykluczyć B.java, kompilacja A.java będzie wymagać również kompilacji B.java.

Jest to jeden z powodów interfejsów w Javie, więc można skompilować interfejs bez potrzeby kompilowania implementacji.

Powiązane problemy