Maven - все или родительский проект для агрегации?
Для образовательных целей я настроил макет проекта следующим образом (плоский, чтобы лучше подходить к затмению):
-product
|
|-parent
|-core
|-opt
|-all
Родитель содержит совокупный проект с core, opt и все. Ядро реализует обязательную часть приложения. Опция является необязательной частью. Предполагается, что все объединяет ядро с opt, и эти два модуля перечислены как зависимости.
Я сейчас пытаюсь сделать следующие артефакты:
- продукт-core.jar
- Продукт-ядро-src.jar
- Продукт-ядро-с-dependencies.jar
- продукт-opt.jar
- продукт-неавтоматического src.jar
- продукт-неавтоматического с-dependencies.jar
- продукт-all.jar
- продукт-все-src.jar
- продукт-все-с-dependencies.jar
Большинство из них довольно просты в производстве. У меня есть некоторые проблемы с агрегирующими артефактами. Мне удалось создать product-all-src.jar с пользовательским дескриптором сборки в модуле "all", который загружает исходные коды для всех нетранзитивных deps, и это прекрасно работает. Этот метод также позволяет мне сделать product-all-with-dependencies.jar.
Однако недавно я обнаружил, что вы можете использовать цель source: aggregate в плагине исходного кода для агрегирования источников всего агрегатного проекта. Это также верно для плагина javadoc, который также агрегирует за счет использования родительского проекта.
Таким образом, я разрываюсь между моим подходом к модулю "все" и отказом от модуля "все" и просто использую модуль "родитель" для всей агрегации. Кажется нечистым иметь некоторые совокупные артефакты, созданные в "родителе", а другие - во "всем". Есть ли способ сделать jar-файл "весь продукт" в родительском проекте или объединить Javadoc в проекте "все"? Или мне просто оставить оба?
Спасибо
2 ответа
Сглаженные деревья не часто используются больше. Это было сделано несколько лет назад, чтобы разобраться с тем, как Eclipse обрабатывал проекты, и отсутствием хорошей интеграции Maven и Eclipse. Если вы используете m2eclipse для импорта проектов Maven в Eclipse, у вас не возникнет проблем с типичным для maven вложенным деревом.
Что является хорошим примером того, как структурировать сборку Maven? Сам источник проекта Maven. В нем есть все нужные вам части, включая окончательную сборку, которая упаковывает пакеты.
Типичная вложенная структура имеет иерархию сверху вниз, в которой родительский элемент выполняет агрегацию модулей под ним, а дочерние элементы наследуют значения от родительского элемента. Хотя они могут и иногда являются отдельными, это не норма.
Я бы предложил просто оставить дескриптор сборки со значением "all", переместить его в parent / и соответственно изменить parent/pom.xml, а затем создать эту сборку, выполнив что-то вроде mvn -f parent/pom.xml assembly:assembly
, Другими словами, да, удалите избыточный проект для "всего", так как он просто дублирует то, что "родительский" уже делает.
С другой стороны, "родитель" кажется плохим выбором имен для этого проекта, если это агрегатный проект, а не просто родительский pom.xml.
[Редактировать]
Хотя это гораздо более крупный проект, возможно, проект, который изложен, как вы представляете, является верблюдным проектом Apache. Проверьте это здесь: http://camel.apache.org/source.html. Существует родительский / модуль, который обрабатывает все для всего остального, и отдельный модуль для создания фактических дистрибутивов сборки в apache-camel/ (с дескрипторами сборки в apache-camel/src//main/descriptors). Возможно, это будет больше помочь.