компиляция только части исходного дерева с помощью ant
Вопрос
Скажем, у меня есть исходники в дереве src/ (и, возможно, в дереве тестов).Скажем, я хотел бы скомпилировать только часть этого дерева.Причины, по которым я мог бы захотеть это сделать, различны.Например, я могу захотеть создать минимально возможный jar (без включения определенных классов) или мне может потребоваться максимально быстрое время компиляции того, что я компилирую.Однако мне очень хочется скомпилировать все зависимости!
Этого можно легко добиться из командной строки с помощью:
javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java
А как это сделать с помощью ant?Яванский муравей задача компилирует все:
Справочник источника и пункта назначения будет отсканировано для компиляции исходных файлов Java.
Можно использовать excludes
и includes
параметры, но они проблематичны для этой цели.На самом деле, кажется, что нужно явно настроить все includes
(не автоматический поиск зависимостей) и даже худший что исключает имеет приоритет над включениями:
Когда используются как включение, так и исключение, только файлы/каталоги, которые соответствуют хотя бы одним из шаблонов, и не совпадают любой из эксплуатационных шаблонов используются.
Таким образом, вы не можете использовать
<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
excludes="**/*.java" includes="src/path/to/MyClass.java" />
Потому что он ничего не скомпилирует :-(
Есть ли способ добиться этой простой командной строки javac
с муравьем?
ОТРЕДАКТИРОВАНО:Спасибо за ваш ответ, Сэди, я принимаю его, потому что он действительно работает так, как мне было интересно в этом вопросе.Но у меня есть пара комментариев (слишком длинных, чтобы их можно было разместить в поле для комментариев вашего ответа):
1) Я читал документацию (см. ссылки выше), но неясно, что всего за includes
на самом деле вы также исключаете все остальное
2) Когда ты просто includes
муравей записывает что-то вроде
[javac] Compiling 1 source file to /my/path/to/build
даже если зависимости заставляют компилировать (гораздо) больше, чем один исходный файл.
Решение
Почему вы одновременно и исключаете, и включаете?Если у вас есть хотя бы одно включение, файлы компилируются только в том случае, если они включены явно.Итак, это должно работать:
<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 только определенные пакеты или классы, используйте атрибут набора файлов.
<jar jarfile="${outlib}/something.jar">
<fileset dir="${build.dir}">
<include name='src/path/to/classes' />
</fileset>
</jar>
Опять же, вы можете использовать несколько включений для объединения отдельных пакетов.Поэкспериментируйте с включениями и прочитайте документацию и вы обязательно найдете нужный вам ответ.
Другие советы
Старый вопрос, но я боролся с той же проблемой и нашел более элегантное решение.Итак, вот оно, на будущее:
Согласно документам ant <javac>
элемент является неявным <fileset>
и поэтому может принять Селекторы нравиться <filename name="**/MyClass.java"/>
, так что это скомпилирует только MyClass.java:
<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
<filename name="**/path/to/MyClass.java"/>
</javac>
На самом деле только муравей чеки все, если вы запустите компиляцию дважды подряд, вы заметите, что вторая выполняется намного быстрее.На самом деле его легко убедить пропустить что-то.
Если вы даже не хотите, чтобы он учитывал все, вам придется разбить его на более мелкие модули/проекты/деревья исходного кода, чтобы вы явно указывали ant, что компилировать.
Просто укажите только список файлов, разделенных запятыми, которые вы хотите создать.Скажем, пример
<property name="includeFileList" value="<name of java class>.java"/>
<javac srcdir="${src.dir}" destdir="${build.dir}"
target="1.6" debug="true" includes="${includeFileList}"/>
Это будет работать.