компилирование только части исходного дерева с помощью ant - PullRequest
9 голосов
/ 15 октября 2008

Скажем, у меня есть мои источники в моем src / дереве (и, возможно, в моем тесте / дереве). Скажем, я хотел бы собрать только часть этого дерева. Причины, почему я мог бы хотеть сделать это, разнообразны. В качестве примера, я мог бы захотеть создать наименьший возможный jar (без включения определенных классов), или мне может потребоваться самое быстрое время компиляции для того, что я компилирую. Я абсолютно хочу скомпилировать все зависимости!

Это может быть легко достигнуто из командной строки с помощью:

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java

Теперь, как вы можете сделать это с муравьем? Задача javac ant компилирует все :

Исходный и целевой каталог будет рекурсивно сканироваться на Java исходные файлы для компиляции.

Можно использовать параметры excludes и includes, но они проблематичны для этой цели. На самом деле, кажется, что нужно явно настроить все includes (не автоматический поиск зависимостей), а даже худший , который исключает , имеет приоритет над включениями :

Когда включены и исключение используется, только файлы / каталоги, которые соответствовать хотя бы одному из включаемых шаблоны и не совпадают любой из исключить шаблоны используются.

Таким образом, вы не можете использовать

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  

Потому что он ничего не скомпилирует: - (

Есть ли способ получить эту простую командную строку javac с помощью ant?


Отредактировано: Спасибо за ваш ответ, Сэди, я принимаю его, потому что он работает так, как мне было интересно в этом вопросе. Но у меня есть пара комментариев (слишком длинная, чтобы быть в поле комментариев вашего ответа):

1) Я прочитал документацию (см. Ссылки выше), но неясно, что, просто includes вы фактически исключаете все остальное

2) Когда вы просто includes ant регистрируете что-то вроде

[javac] Compiling 1 source file to /my/path/to/build

, даже если зависимости делают его компиляцией (намного) более чем одного исходного файла.

Ответы [ 4 ]

13 голосов
/ 15 октября 2008

Почему вы исключаете и включаете? Если у вас есть хотя бы одно включение, то файлы компилируются, только если они явно включены. Так что это должно работать:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />

Или более гибко:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>

Чтобы включить в Jar только определенные пакеты или классы, используйте атрибут fileset

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>

Опять же, вы можете использовать несколько включений для объединения отдельных пакетов. Поэкспериментируйте с include и прочитайте документацию , и вы обязательно найдете нужный ответ.

3 голосов
/ 12 июля 2015

Старый вопрос, но я боролся с той же проблемой и нашел более элегантное решение. Так что вот, для дальнейшего использования:

Согласно ant docs, элемент <javac> является неявным <fileset> и поэтому может принимать селекторов подобно <filename name="**/MyClass.java"/>, так что это будет компилировать только MyClass.java:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
  <filename name="**/path/to/MyClass.java"/>
</javac>
0 голосов
/ 23 июня 2013

Просто дайте только разделенный запятыми список файлов, которые вы хотите построить. Скажем, пример

<property name="includeFileList" value="<name of java class>.java"/>

<javac srcdir="${src.dir}" destdir="${build.dir}"
       target="1.6" debug="true" includes="${includeFileList}"/>

Это будет работать.

0 голосов
/ 15 октября 2008

На самом деле, только муравей проверяет все, если вы запускаете компиляцию два раза подряд, вы заметите, что второй намного быстрее. На самом деле, его легко убедить пропустить вещи.

Если вы даже не хотите, чтобы он учитывал все, вам придется разбить его на более мелкие модули / проекты / исходные деревья, чтобы вы явно указали муравью, что компилировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...