Я немного шокирован тем, что (если?) эти точные вопросы не задавались, но 15 минут сканирования SO не совпадали точно. (Если я ошибаюсь, укажите мне правильный путь и проголосуйте, чтобы закрыть...)
Вопрос 1:
Каковы наилучшие методы для разработки Java-проектов в системе сборки Ant? Для наших целей мы имеем следующий контекст (возможно, большинство из них не имеет значения):
- Большинство разработчиков используют Eclipse (не все)
- Проект поддерживается в подрывной деятельности
- Недавно созданные проекты были перенесены в Hudson, в которых мы хотим использовать плагин release для управления выпусками и некоторые пользовательские сценарии для автоматического развертывания
- Этот проект является "обычным" приложением, своего рода "прототипом производства" с очень ограниченным количеством пользователей, но они находятся на удаленных сайтах с разделением воздушной завесы, поэтому доставка версий, отслеживаемых артефактов для легкой установки, ручной сбор данных/восстановление и дистанционная диагностика.
- Некоторые зависимости (JAR) включены в репо SVN; другие могут быть извлечены через Ant script во время сборки, если это необходимо. Ничего не похоже на Айви (и, пожалуйста, не говорите мне переключиться на Maven3... Я знаю, и мы сделаем это, если/когда придет соответствующее время.)
- В состав входят JUnit, FindBugs, CheckStyle, PMD, JavaDoc, создание пользовательской документации
- Два или три первичных артефакта JAR (основной артефакт приложения плюс несколько минимальных API JAR для включения в несколько связанных приложений)
- Желание распространить следующие артефакты распространения:
- "Полный" источник + tar-архив с всеми разрешенными зависимостями, jars и JavaDoc prebuilt.
- tar tarball с только документами и JavaDoc, банками и вспомогательными сценариями оболочки и т.д.
- источник "Partner" + bin, у которого есть "общий" источник, с которым, вероятно, будут сталкиваться разработчики-партнеры, и связанные с ними тестовые окна.
Текущая структура выглядит так:
project-root/ project-root/source project-root/source/java // main application (depends on -icd) project-root/source/java-icd // distributable interface code project-root/source/test // JUnit test sources project-root/etc // config/data stuff project-root/doc // pre-formatted docs (release notes, howtos, etc) project-root/lib // where SVN-managed or Ant-retrieved Jars go project-root/bin // scripts, etc...
При времени сборки он расширяется и включает:
build/classes // Compiled classes build/classes-icd build/classes-test build/javadoc build/javadoc-icd build/lib // Compiled JAR artifacts build/reports // PMD, FindBugs, JUnit, etc... output goes here build/dist // tarballs, zipfiles, doc.jar/src.jar type things, etc.. build/java // Autogenerated .java products build/build.properties // build and release numbering, etc...
Вопрос 2:
Как я могу поддерживать строгое разделение в дереве разработки между элементами, контролируемыми ревизией, и артефактами времени сборки. Производя последовательное распределение, как указано выше, и позволяю мне обрабатывать дерево разработки как операционное/распределение во время разработки и тестирования? В частности, я не хочу, чтобы мои <jar>
задачи отбрасывали .jar файлы в каталог верхнего уровня lib
- этот каталог на деревьях разработчиков является неприкосновенной территорией SVN. Но распространение чего-то для общественного использования с помощью build/lib/*.jar
вызывает недоумение. То же самое можно сказать о документации и других встроенных артефактах, которые мы хотим отображать в постоянном месте в дистрибутиве, но не хотим, чтобы разработчики и пользователи использовали совершенно разные структуры каталогов.
Наличие всех сгенерированных продуктов в отдельном каталоге build/
очень полезно для времени разработки, но это раздражающий артефакт для распространения. Для целей распространения я предпочел бы, чтобы все JARs сидели в одном месте lib
, на самом деле структура, подобная приведенной ниже, имеет наибольший смысл. В настоящее время мы строим эту структуру "на лету" с помощью ant dist
, выполняя сложные запутанные манипуляции с созданием артефактов .tar.gz и .zip.
Что я думаю, что dist должен выглядеть так:
project-root/ project-root/source // present in only some dists project-root/etc // same as in development tree project-root/doc // same as in development tree project-root/doc/javadoc // from build project-root/lib // all dependency and built JAR files project-root/bin // same as in development tree build.properties // build and release numbering, etc...
Этот вопрос узко связан с тем, "как мне поддерживать планы по разработке и распределению проектов?" как я спросил выше; но и собирать информацию о макетах проекта Java/ Ant в целом и критику нашего конкретного подхода. (Да, если вы думаете, что это должна быть Wiki сообщества, я сделаю так...)