Рекомендации по макету проекта Java для сборок на основе Ant - PullRequest
11 голосов
/ 23 ноября 2010

Я немного шокирован тем, что (если?) Эти точные вопросы не задавались, но 15 минут сканирования ТАК не дали точного соответствия.(Если я ошибаюсь, укажите мне правильный путь и проголосуйте за закрытие ...)

Вопрос 1:

Каковы лучшие практики для размещения проектов Java подСистема сборки Ant? Для наших целей у нас есть следующий контекст (возможно, большая часть которого не имеет значения):

  • Большинство разработчиков используют Eclipse (не все)
  • Projectподдерживается в subversion
  • Сборки проектов недавно были перенесены в Hudson, в котором мы хотим использовать плагин релиза для управления релизами и некоторые пользовательские скрипты для управления автоматическим развертыванием
  • Этот проект "обычное «приложение», своего рода «производственный прототип» с очень ограниченным пулом пользователей, но они находятся на удаленных площадках с разделением воздушной прослойки, поэтому важно предоставлять проверенные версии отслеживаемые артефакты для простой установки, ручного сбора / восстановления данных и удаленной диагностики.
  • Некоторые зависимости (JAR) включены в репозиторий SVN;другие могут быть получены с помощью скрипта ant во время сборки, если это необходимо.Ничего такого, как Айви, пока нет (и, пожалуйста, не говорите мне, чтобы я переключился на Maven3 ... Я знаю, и мы сделаем это, если / когда придет подходящее время.)
  • Сборка включает JUnit, FindBugs,CheckStyle, PMD, JavaDoc, немного пользовательской генерации документации
  • Два или три основных артефакта JAR (артефакт основного приложения плюс пара минимальных JAR API для включения в несколько связанных приложений)
  • Желание распространять следующие артефакты распространения:
    • a "Полный" архив исходного кода + bin со всеми разрешенными зависимостями, jars и предварительно созданный JavaDoc
    • tar-файл bin, только с документами и JavaDoc, jars,и вспомогательные сценарии обертки и т. д.
    • источник "Partner" + корзина, в которой есть "общий" источник, на который могут рассчитывать разработчики-партнеры, и связанные тестовые случаи

Текущая структура выглядит следующим образом

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:

Как я могуmaintain строгое разделение в дереве разработки между элементами, контролируемыми ревизиями, и артефактами времени сборки WHILE , создающими согласованное распределение, как указано выше И , что позволяет мне рассматривать дерево разработки как операционное / распределение во времяразработка и тестирование? В частности, мне не хочется, чтобы мои <jar> задачи сбрасывали файлы .jar в каталог верхнего уровня lib - этот каталог в деревьях разработчиков является неприкосновенной территорией SVN.Но распространение чего-либо для публичного использования с build/lib/*.jar вызывает недоумение.То же самое относится и к документации и другим встроенным артефактам, которые мы хотим отображать в согласованном месте в дистрибутиве, но не хотим, чтобы разработчики и пользователи использовали совершенно разные структуры каталогов.

Наличие всех сгенерированных продуктовв отдельном каталоге build/ очень хорошо для времени разработки, но это раздражающий артефакт для распространения.В целях распространения я бы предпочел, чтобы все JAR-файлы находились в одном 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 в целом и критике нашего конкретного подхода.(Да, если вы считаете, что это должна быть Вики сообщества, я сделаю это так ...)

Ответы [ 4 ]

3 голосов
/ 23 ноября 2010

Единственное, что я могу предложить, это то, что дерево каталогов, которое вы распространяете, не должно быть в CVS.Есть скрипт, который собирает каталог dist в build, а затем архивирует его.Этот сценарий может объединять контролируемые исходным кодом и производные файлы с содержанием его сердца.Он также может выполнять такие действия, как очистка каталогов SVN, которые вы не хотите распространять.Если вы хотите иметь возможность обрабатывать деревья разработки и распределенные деревья таким же образом, просто убедитесь, что компоновка dist такая же, как компоновка проекта разработки - самый простой способ сделать это - скопировать все, кроме подкаталога build(и каталоги CVS, и, возможно, такие вещи, как Eclipse .project и .classpath).

Я подозреваю, что вам не понравится это предложение.Может случиться так, что вы привязаны к идее, что распределенный файл - это просто переносимая версия вашей среды разработки - но я думаю, что это так, это не так, никогда не может и не должно быть.Если вы согласны с этой идеей, вы можете посчитать мое предложение приемлемым.

РЕДАКТИРОВАТЬ: Я подумал об этом немного больше и посмотрел на некоторые из сценариев, которые я использую.Я думаю, что я бы сделал в этой ситуации, чтобы построить отдельное дерево даже в процессе разработки;Направьте среду выполнения в Project-root / build / app (или, возможно, Project-root / build, если можете), а не в Project-root, а затем по символической ссылке (или скопируйте, если у вас нет символических ссылок) все необходимое (статическое лииз корневого каталога проекта или из производного в).Построение дистрибутива может быть таким же простым, как архивирование этого дерева (конечно, с помощью инструмента, который разрешает символические ссылки).Хорошая вещь в этом заключается в том, что она позволяет очень чистую структуру исполняемого дерева - она ​​не будет содержать исходных каталогов, файлов IDE, сценариев сборки или других вспомогательных файлов изнутри проекта и т. Д. Если вы используете Subversion, он по-прежнему будет содержать каталоги .svn внутри чего-либо, связанного со статическими областями;если бы вы использовали Mercurial, он не содержал бы ничего .hg.

3 голосов
/ 23 ноября 2010

В плане компоновки мы используем что-то, что превратилось в нечто очень похожее на макет Maven ( см. Здесь ). Это очень функциональный макет, который используется многими людьми. И, если вы хотите переключиться на Maven позже, у вас все готово. У нас есть несколько вариантов, наиболее важным из которых является то, что мы разделяем автоматизированные модульные и интеграционные тесты.

Что касается смешения источников и создания артефактов - я, безусловно, рекомендовал бы против этого. Как вы уже видели, это портит IDE-индексирование и контроль версий и, как правило, усложняет жизнь.

Насколько я могу сказать, вы должны либо принять это смешивание, либо скопировать свои зависимости как часть сборки и рассматривать вывод как отдельный проект - возможно, постоянно открывать в другом окне IDE, если вам это нужно. Идея смешать вашу работу «как пользователя» с «продюсером» вашего релиз-пакета звучит так, как будто это может сбить с толку.

1 голос
/ 23 сентября 2012

http://ant.apache.org/ant_in_anger.html

Проект содержит подкаталоги

  • bin общие двоичные файлы, скрипты - поместите это в путь.
  • build Это дерево для строительства; Ant создает его и может очистить в «чистом» проекте.
  • dist Распределительные выходы входят сюда; каталог создается в Ant и очищает его
  • документация Документация, созданная вручную
  • lib Импортированные библиотеки Java входят в этот каталог
  • Источник src входит под этим деревом в иерархию, которая соответствует именам пакетов.
0 голосов
/ 23 ноября 2010

Есть также (возможно, несколько устаревшие) общие рекомендации от Sun / oracle для макета проекта, на которые вы, возможно, захотите взглянуть:

Рекомендации, шаблоны и код для сквозных Java-приложений

...