Как я могу исключить источники в задаче javac в ant?

В моем файле 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/ было скомпилировано в этой задаче).

Я полный ant n00b, и документация не очень помогла мне. Я вижу несколько мест, где говорится, что существуют различные исключения/исключение элементов/атрибутов, но каждая вариация, о которой я могу думать, либо не имеет никакого эффекта, либо приводит к ошибке, например: "blah не поддерживает атрибут exclude".

Ответы

Ответ 1

Несколько человек предложили использовать <exclude>. Это не работало с тем, как была задана моя задача. trashgod отвечает на шестой пример на этой странице, который дал мне представление о том, как реструктурировать спецификацию моей задачи.

Похоже, моя проблема связана с тем, как я указывал исходные файлы. Вместо использования <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/**"/>

(На самом деле, я удивлен тем, что там было в первую очередь работало вообще.)

Ответ 2

Из моих экспериментов вы не должны включать полный путь к файлу, который вы хотите исключить. Это не работает:

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

но это делает:

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

Ответ 3

Я не уверен в остальном, но вложенный элемент <exclude/> должен работать в 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/" />
        </src>
        <exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/>
        ...
    </javac>
    ...
</target>

Ответ 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

попробовать папка "test" в {source.dir} не будет выполнена

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