Как я могу исключить источники в задаче 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>