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

StackOverflow https://stackoverflow.com/questions/203180

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top