Компиляция только части исходного дерева с помощью ant

Скажем, у меня есть исходники в моем 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

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

Если вы хотите создать JAR наименьшего размера, сделайте это в задаче <jar>; в нем есть все необходимые атрибуты. Если вам нужно самое быстрое время компиляции ... ну, компиляция на Java всегда занимает всего несколько секунд, я не понимаю, как вы могли бы здесь много выиграть. Сосредоточьтесь на чем-нибудь более полезном!

Vladimir Dyuzhev 15.10.2008 04:20

Это зависит от размера вашего проекта. Я обнаружил, что когда проект превышает 600 или 700 классов, компиляция начинает значительно замедляться, и мне приходится как-то пытаться разделить его.

Marcus Downing 15.10.2008 06:40

@Vladimir Dyuzhev - это не отвечает на вопрос ОП.

talonx 15.02.2011 09:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
3
14 373
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

На самом деле, 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 и прочтите документацию, и вы обязательно найдете нужный ответ.

пожалуйста, посмотрите мой полный комментарий в вопросе выше

Davide 15.10.2008 19:35

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

<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>

Другие вопросы по теме