Как я могу исключить источники в задании javac в ant? - PullRequest
15 голосов
/ 30 июня 2010

В моем 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, и документация мне не сильно помогла. Я вижу несколько мест, где говорится, что существуют различные элементы / атрибуты исключения / исключения, но каждый вариант, о котором я могу подумать, либо не имеет никакого эффекта, либо приводит к ошибке, например " бла не поддерживает исключение атрибут».

Ответы [ 6 ]

16 голосов
/ 30 июня 2010

Несколько человек предложили использовать <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/**"/>

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

10 голосов
/ 23 октября 2013

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

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

но этот работает:

<javac>
(...>
   <exclude name="com/foo/blah/blah1/FILENAME.java"/>
(...)
</javac>
5 голосов
/ 30 июня 2010

В остальном я не уверен, но вложенный элемент <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>
5 голосов
/ 30 июня 2010

Попробуйте

<javac>
(...>
<exclude name="${src.dir}/com/foo/bar/quux/dontwant/*" />
(...)
</javac>
4 голосов
/ 10 декабря 2013

Если вы пытаетесь исключить классы Java, но Ant все еще пытается их скомпилировать, то это может быть связано со ссылками на эти классы в вашем коде.

Если A.java имеет ссылку на B.javaи вы пытаетесь исключить B.java, тогда для компиляции A.java потребуется также компилировать B.java.

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

1 голос
/ 16 марта 2013

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

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