Подтвердить что ты не робот

Рекомендации по компоновке Java-проектов для построенных на основе Ant

Я немного шокирован тем, что (если?) эти точные вопросы не задавались, но 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 сообщества, я сделаю так...)

4b9b3361

Ответ 1

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

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

EDIT: Я подумал об этом немного больше и посмотрел на некоторые из сценариев, которые я использую. Я думаю, что я бы сделал в этой ситуации, чтобы построить отдельное дерево даже в разработке; укажите среду выполнения в проекте-root/build/app (или, возможно, project-root/build, если можете), а не в корне проекта, а затем symlink (или скопируйте, если у вас нет символических ссылок) все необходимое (будь то статическое, из корня проекта или из производного, из встроенного) в это. Построение распределения может быть таким же простым, как разворачивание этого дерева (с помощью инструмента, который разрешает символические ссылки, конечно). Приятная вещь в этом заключается в том, что структура исполняемого дерева очень чистая - в него не будут входить исходные каталоги, файлы IDE, скрипты сборки или другие поддерживающие файлы внутри проекта и т.д. Если вы используете Subversion, он все равно будет содержать каталоги .svn внутри любого символа, связанного с статическими областями; если вы используете Mercurial, он не будет содержать ничего .hg.

Ответ 2

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

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

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

Ответ 3

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

Проект содержит вспомогательные каталоги

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