Скажем, у меня есть исходники в моем src / tree (и, возможно, в моем test / tree). Скажем, я хотел бы скомпилировать только часть этого дерева. Причины, по которым я могу захотеть это сделать, разнообразны. В качестве примера я мог бы создать минимально возможную банку (без включения определенных классов) или мне может потребоваться самое быстрое время компиляции для того, что я компилирую. Однако я абсолютно хочу скомпилировать все зависимости!
Этого легко добиться из командной строки с помощью:
javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java
Теперь, как вы можете сделать это с помощью муравья? Муравей javac задача все компилирует:
The source and destination directory will be recursively scanned for Java source files to compile.
Можно использовать параметры excludes и includes, но они для этого проблематичны. Фактически, кажется, что нужно явно настроить все includes (не автоматический поиск зависимостей) и даже худшее, что Исключения имеют приоритет над включениями:
When both inclusion and exclusion are used, only files/directories that match at least one of the include patterns and don't match any of the exclude patterns are used.
Таким образом, вы не можете использовать
<javac srcdir = "${src.dir}" destdir = "${build.dir}" classpathref = "classpath"
excludes = "**/*.java" includes = "src/path/to/MyClass.java" />
Потому что он ничего не скомпилирует :-(
Есть ли способ достичь этой простой командной строки javac с помощью ant?
Обновлено: Спасибо за ваш ответ, Сэди, я принимаю его, потому что он действительно работает так, как мне было интересно в этом вопросе. Но у меня есть пара комментариев (слишком длинных, чтобы быть в поле для комментариев к вашему ответу):
1) Я прочитал документацию (см. Ссылки выше), но неясно, что с помощью только includes вы фактически исключаете все остальное.
2) Когда вы просто includes, муравей регистрирует что-то вроде
[javac] Compiling 1 source file to /my/path/to/build
даже если зависимости заставляют его компилировать (намного) больше, чем просто один исходный файл.
Это зависит от размера вашего проекта. Я обнаружил, что когда проект превышает 600 или 700 классов, компиляция начинает значительно замедляться, и мне приходится как-то пытаться разделить его.
@Vladimir Dyuzhev - это не отвечает на вопрос ОП.




На самом деле, Ant only чеки все, если вы запустите компиляцию дважды подряд, вы заметите, что второй выполняется намного быстрее. На самом деле, его легко убедить что-то упустить.
Если вы даже не хотите, чтобы он все рассматривал, вам придется разбить его на более мелкие модули / проекты / деревья исходного кода, чтобы вы явно указали муравью, что компилировать.
Почему вы исключаете, а также включаете? Если у вас есть хотя бы одно включение, то файлы компилируются только в том случае, если они явно включены. Итак, это должно работать:
<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>
Опять же, вы можете использовать несколько включений для объединения отдельных пакетов. Поэкспериментируйте с include и прочтите документацию, и вы обязательно найдете нужный ответ.
пожалуйста, посмотрите мой полный комментарий в вопросе выше
Просто укажите только список файлов, которые вы хотите создать, через запятую. Скажем пример
<property name = "includeFileList" value = "<name of java class>.java"/>
<javac srcdir = "${src.dir}" destdir = "${build.dir}"
target = "1.6" debug = "true" includes = "${includeFileList}"/>
Это будет работать.
Старый вопрос, но я боролся с той же проблемой и нашел более элегантное решение. Итак, вот оно, для справки в будущем:
Согласно документам 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>
Если вы хотите создать JAR наименьшего размера, сделайте это в задаче <jar>; в нем есть все необходимые атрибуты. Если вам нужно самое быстрое время компиляции ... ну, компиляция на Java всегда занимает всего несколько секунд, я не понимаю, как вы могли бы здесь много выиграть. Сосредоточьтесь на чем-нибудь более полезном!