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

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

Вопрос 1:

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

  • Большинство разработчиков используют Eclipse (не все)
  • Проект поддерживается в подрывной версии
  • Сборки проектов недавно были перенесены в Hudson, в котором мы хотим использовать плагин выпуска для управления выпусками, а также некоторые настраиваемые сценарии для обработки автоматического развертывания.
  • Этот проект представляет собой «обычное» приложение, своего рода «производственный прототип» с очень ограниченным кругом пользователей, но они находятся на удаленных объектах с разделением воздушных зазоров, поэтому доставляются отслеживаемые по версиям артефакты для легкой установки, ручного сбора / восстановления данных, и удаленная диагностика важна.
  • Некоторые зависимости (JAR) включены в репозиторий SVN; другие могут быть получены с помощью сценария ant во время сборки, если это необходимо. Ничего особенного, вроде Айви, пока нет (и, пожалуйста, не говорите мне переходить на Maven3 ... Я знаю, и мы сделаем это, если / когда придет подходящее время).
  • Сборка включает в себя JUnit, FindBugs, CheckStyle, PMD, JavaDoc, немного настраиваемой генерации документации
  • Два или три основных артефакта JAR (основной артефакт приложения плюс пара минимальных API JAR для включения в несколько связанных приложений)
  • Desire to distribute the following distribution artifacts:
    • a "Full" source+bin tarball with all dependencies resolved, jars and JavaDoc prebuilt
    • tar-архив bin, содержащий только документы и JavaDoc, jar-файлы, вспомогательные сценарии-оболочки и т. д.
    • «Партнерский» источник + корзина, в которой есть «общий» источник, на который, вероятно, будут смотреть партнерские разработчики, и связанные тестовые наборы.

Текущая структура выглядит так

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:

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

Размещение всех сгенерированных продуктов в отдельном build/ каталоге очень удобно для разработки, но это неприятный артефакт для распространения. В целях распространения я бы предпочел, чтобы все JAR-файлы находились в одном lib месте, на самом деле, структура, подобная приведенной ниже, имеет наибольший смысл. В настоящее время мы создаем эту структуру "на лету" с ant dist, выполняя некоторые сложные манипуляции с путями при создании артефактов .tar.gz и .zip.

Как я думаю, должно выглядеть расстояние:

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


person andersoj    schedule 23.11.2010    source источник
comment
Что вы имеете в виду, позволяя мне рассматривать дерево разработки как рабочее / распределение во время разработки и тестирования - вы имеете в виду, что вы не счастливы просто копировать свои неартефактные jar-файлы (например) в ваше построенное дерево?   -  person Steven Mackenzie    schedule 23.11.2010
comment
@ Стивен Маккензи: Конечно, возможно, но кажется неэлегантным делать полную копию всего, от project-root до project-root/build. Может быть, я слишком задумываюсь об этом или просто пытаюсь съесть свой пирог и тоже его съесть ... Я хочу, чтобы мое дерево разработчика выглядело как дерево пользователя, НО я не хочу, чтобы артефакты времени сборки смешивались с ревизией - контролируемые предметы. Возможно, полная копия в подкаталог build/ - единственный реалистичный способ добиться этого ... как вы размещаете свои проекты (в репо, а затем во время сборки?)   -  person andersoj    schedule 23.11.2010


Ответы (4)


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

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

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

person Tom Anderson    schedule 23.11.2010
comment
+1 Мне нравится каждое серьезное, принципиальное предложение, даже если оно противоречит моим нынешним предрассудкам ... спасибо, это входит в мое конечное решение. (И обратите внимание, что мы уже делаем это; мы просто пытаемся минимизировать когнитивный диссонанс и т. Д.) - person andersoj; 23.11.2010
comment
Да, извините, если я просто описываю то, что вы уже делаете. Легче просто сбросить мозг, чем произвести сравнение с тем, что вы описали, а я до отвращения ленив. - person Tom Anderson; 24.11.2010

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

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

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

person Steven Mackenzie    schedule 23.11.2010
comment
Спасибо за комментарии, и макет, который у нас есть, на самом деле является итерацией в направлении чего-то большего, чем макет Maven. Кроме того, вариант использования «пользователь против производителя» - это желание иметь простой способ указать нашу (большую, сложную) внешнюю среду выполнения на дерево / снимок разработчика для быстрого теста выполнения и иметь возможность быстро выполнять итерацию ... На самом деле, я могу возражать против вашего предложения о ручном копировании сборки / дерева. - person andersoj; 23.11.2010
comment
Я думаю, что ваш вариант использования будет отлично работать с полностью отдельным деревом - чтобы итерации были быстрыми, вам нужно убедиться, что вы выполняете только те биты, которые вам нужны, как часть вашей сборки. К сожалению, по моему опыту, Ant не очень хорош в этом! Возможно, вы захотите выборочно выполнять свои цели (например, выполнять компиляцию / jar / развертывание только при изменении кода). - person Steven Mackenzie; 23.11.2010
comment
+1 за использование совета по макету Maven - он работает почти для каждой ситуации, с которой я сталкивался, и аккуратно отделяет производное от источника. - person Gary Rowe; 23.11.2010
comment
Я согласен, чтобы ваш макет соответствовал макету Maven по умолчанию. Таким образом, если вы все же решите перейти на Maven, это будет проще сделать. И когда появятся новые разработчики, они будут знать макет, если они когда-либо работали с Maven. Кроме того, поскольку это стандарт Maven, у вас есть аргумент, который вы можете использовать с разработчиками, если они настаивают на своем отклонении от стандарта. Извините, политика компании - использовать наши макеты Java, такие как Maven. Хотел бы я изменить это, но требуется невероятное количество документов. Ага, решение принял какой-то бестолковый менеджер. Я сочувствую тебе, чувак, но сожалею. - person David W.; 23.11.2010

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

В проекте есть подкаталоги

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

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

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

person FrVaBe    schedule 23.11.2010