2010-05-12 3 views
5

Для образовательных целей я создал макет проекта, как это (плоский, чтобы затмить номера лучше):Проект Maven - 'all' или 'parent' для агрегации?

-product 
| 
|-parent 
|-core 
|-opt 
|-all 

Родитель содержит совокупный проект с ядром, выбор и все. Core реализует обязательную часть приложения. Опция - необязательная часть. Все предполагается объединить ядро ​​с opt, и эти два модуля указаны как зависимости.

Я сейчас пытаюсь сделать следующие артефакты:

  1. продукта core.jar
  2. продукта ядро-src.jar
  3. продукта ядро-с-dependencies.jar
  4. продукт-opt.jar
  5. продукта неавтоматического src.jar
  6. продукта неавтоматического с-dependencies.jar
  7. продукта all.jar
  8. продукта все-src.jar
  9. продукта все-с-dependencies.jar

Большинство из них достаточно просты в изготовлении. Однако у меня есть некоторые проблемы с совокупными артефактами. Мне удалось сделать product-all-src.jar с пользовательским дескриптором сборки в модуле «все», который загружает источники для всех нетранзитивных депо, и это отлично работает. Этот метод также позволяет мне создавать продукт-all-with-dependencies.jar.

Недавно я выяснил, что вы можете использовать исходную совокупную цель в исходном плагине для объединения источников всего агрегатного проекта. Это также справедливо для плагина javadoc, который также агрегируется через использование родительского проекта.

Так что я разорван между модулем «все» и отрывом модуля «все» и просто использую «родительский» модуль для всей агрегации. Нечестно иметь некоторые совокупные артефакты, произведенные в «родительском», а другие - «все». Есть ли способ сделать «продукт-все» jar в родительском проекте или агрегировать javadoc во всем проекте? Или я должен просто сохранить оба?

Благодаря

ответ

5

Сплит-деревья не используются чаще. Это было сделано несколько лет назад для рассмотрения того, как Eclipse обрабатывал проекты и отсутствовал хорошая интеграция Maven и Eclipse. Если вы используете m2eclipse для импорта проектов Maven в Eclipse, у вас не будет проблем с типичным вложенным деревом maven.

Насколько хороший пример того, как структурировать сборку Maven? Источник проекта Maven itself. У этого есть все части, которые Вы желаете, включая окончательный assembly, который упаковывает пакеты.

Типичная вложенная структура имеет иерархию сверху вниз, где родитель выполняет агрегацию модулей под ним, а дети наследуют значения от родителя. Хотя это может и иногда быть раздельным, это не является нормой.

+0

Спасибо за подсказку. Я просто посмотрел на него, и кажется, что источник maven следует за общей макетой, которую я предложил, однако без сглаживания дерева, как вы указали. Конечная сборка IMO не очень чистая, она просто выполняет регулярное выражение grep для всех исходных файлов в каталоге «../», не так просто, если вы хотите, чтобы источники из зависимостей 3: 1 стороны и т. Д. Также не соответствует тому, как javadoc агрегатор (через родительский проект). Мне кажется, что мне не хватает функциональности, я попробую написать альтернативный подход, когда я экспериментирую с некоторыми. Спасибо за указатель. –

+0

BTW, сборник src можно найти по адресу http://svn.apache.org/repos/asf/maven/maven-3/trunk/apache-maven/src/main/assembly/src.xml –

0

Я предлагаю просто держать дескриптор сборки от «все», переместить его родитель/и изменить родитель/pom.xml соответственно, а затем создать эту сборку, делая что-то вроде mvn -f parent/pom.xml assembly:assembly. Другими словами, да, удалите избыточный проект для «все», поскольку он просто дублирует то, что «родитель» уже делает.

На стороне примечание «родительский» выглядит как плохой выбор именования для этого проекта, если он представляет собой агрегатный проект, а не только родительский pom.xml.

[Редактировать]

Хотя гораздо больше проект, возможно, проект, который выкладывается как вы намечаете это апач проект верблюд. Посмотрите здесь: http://camel.apache.org/source.html. Существует родительский/модуль, который обрабатывает все для всего остального, и отдельный модуль для создания реальных дистрибутивов сборки в apache-camel/(с дескрипторами сборки в apache-camel/src // main/descriptors). Возможно, это будет больше помощи.

+0

Вы предлагаете, чтобы у меня был один родитель с родительским помпом и один «агрегат», который строил полный продукт? Должны ли вы поместить «dependencyManagement» в родительском или в совокупности? Можете ли вы предложить хороший пример проекта? –

+0

По существу да. Если ваш «агрегат» не делает ничего, кроме вызова дескриптора сборки, хотя нет необходимости иметь его в отдельном модуле. Это может просто жить с pom верхнего уровня (возможно, не с родителем, как я впервые предложил). и должны жить с родительским pom. Если у вас много сложной агрегации (скажем ... индивидуальная сборка для Windows, Linux и OSX), то эти агрегаты должны быть в отдельных модулях. В вашем случае это звучало как просто простая сборка. – whaley

+0

Извините за перетаскивание этого, но как вы делаете полную банку для совокупного проекта? Я не могу понять, как это сделать, не создавая проект «все». –

Смежные вопросы