Соглашения об именовании Maven для иерархических проектов с несколькими модулями - PullRequest
32 голосов
/ 24 февраля 2012

У меня есть вопрос по соглашениям об именах Maven (groupId, artifactId и имена каталогов) в многомодульном проекте с иерархической структурой каталогов.

Исследования

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

  1. Возможное дублирование для моего вопроса, но оно не охватывает уровни множественной иерархии.

  2. Имя каталога проекта должно соответствовать artificatId .

  3. Руководство по соглашениям об именах Приведите примеры:

    • groupId будет уникально идентифицировать ваш проект во всех проектах, поэтому нам нужно применить схему именования.Он должен следовать правилам имени пакета (например, org.apache.maven, org.apache.commons, org.apache.maven.plugins)

    • artifactId Если вы создали его, вы можете выбрать любое имя с строчными буквами и без странных символов.(например, maven, commons-math)

Это довольно просто, и я понимаю это, но есть несколько вещей, которые все еще неясны.

artifactId примеры, упомянутые в соглашениях, могут применяться только к одноуровневому модулю иерархии.

Примеры

Я просмотрел репозитории maven и извлек несколько примеров:

Spring в основном использует имена: spring-core, spring-context, spring-контекстно-поддержка.Все автономные модули имеют одноуровневую иерархию и префикс для повышения эффективности поиска.Проблем нет, поскольку иерархия не такая глубокая.

Наименования Apache CXF для Apache весьма нетрадиционны.Артефакты - это автономные модули с 5 различными именами артефактов, например.CxF-инструменты-wsdlto-JAXB-привязки.

Существует множество артефактов (cxf-rt-databinding-aegis, cxf-rt-databinding-xmlbeans, cxf-rt-databinding-sdo), которые могут быть сгруппированы в несколькомодульный проект (cxf-rt-databindings), но они этого не сделали, и имена стали спагетти.

Наконец, Плагины Maven - это первый проект с несколькими модулями (после org.apache.maven), в котором есть такие артефакты, как: maven-compiler-plugin, maven-forcecer-plugin.

Существует довольно много примеров, и все они следуют различным соглашениям по именованию artifactIds (следовательно, projectкаталоги).

Результат

Используя лучшие примеры из примеров, рассмотрим уровни иерархии.

Одноуровневое именование иерархии будет (

groupId:    org.organization.project
artifactId: project-portal ---.
                              |
                              project-portal-service
                              |
                              project-portal-plugins (continued on next diagram)
                              |
                              project-portal-util

(продолжение) двухуровневая иерархия будет:

groupId:    org.organization.project.plugins
artifactId: project-portal-plugins ---.
                                      |
                                      project-sample-plugin
                                      |
                                      project-another-great-plugin
                                      |
                                      ???? (multiple module project)

Вы видите вопросительные знаки? Вот где

Вопросы

Я следовал соглашениям из примеров (игнорируя спагетти ApacheПример CXF):

  • Root - проект-портал (напр.spring-core, maven-core)
  • Имена иерархии первого уровня наследуются от root - project-portal-plugins (например, spring-context-support).
  • Имена иерархии второго уровня -project-sample-plugin (например, maven-compiler-plugin).

И теперь мы застряли на третьем уровне, как в старых играх без сохранений и контрольных точек.

  1. Это правильный путь именования каталогов, взятый из примеров Maven для более глубоких уровней иерархии?
  2. Существуют ли какие-либо соглашения или правила, которым вы следуете, чтобы поддерживать простые имена каталогов и артефактов, избегая имен спагетти на более глубоких уровнях?
  3. Если есть простые имена, будет ли groupId сохранять дублированные имена артефактов (что произойдет из-за простоты) из коллизий в репозитории?
  4. Как насчет поиска и поиска артефактов в сети / репозиториях с дублированными именами (из-за простоты))?

Я не хочу видеть в своей структуре проекта такой модуль, как project-portal-liferay-plugins-themes для родителей или, что еще хуже, project-portal-liferay-plugins-themes-white-puppy-wtf-name для детей.

Если бы вы могли высказать свое мнение и попрактиковаться в решении любого из упомянутых вопросов и возможных проблем, это было бы большой помощью не только для меня, но и для всех, кто использует maven.Спасибо.

Ответы [ 3 ]

20 голосов
/ 27 февраля 2012

В прежние времена с Maven я следовал следующей структуре, которую вы описали:

appname
  +--- appname-module1
  +--- appname-module2
              +--- appname-module2-chhild1
              +--- appname-module2-chhild2
  +--- appname-module3

Но это станет смешным, если вы получите больше уровней.

Поэтому я решил изменить свое мнение и теперь использую такие вещи, как:

appname
  +--- module1
  +--- module2
          +--- chhild1
                 +--- subchild1
          +--- chhild2
  +--- module3

Единственное, что я изменяю по уровням, это groupId ...

appname (groupId: com.soebes.appname)
  +--- module1 (groupId: com.soebes.appname.module1)
  +--- module2 (groupId: com.soebes.appname.module2)
          +--- chhild1 (groupId: com.soebes.appname.module1.child1)
          +--- chhild2 (groupId: com.soebes.appname.module1.child2)
  +--- module3 (groupId: com.soebes.appname.module3)
4 голосов
/ 27 февраля 2012

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

Например, я бы попытался ответить, где артефакты заканчиваются их именем и каковышанс столкнуться с конфликтом.Для фреймворка, такого как spring, имеет смысл иметь имя проекта в artifactId («spring- *»), то же самое верно для библиотек commons (хотя «commons-logging» может иметь рискованное имя).

Для проекта, который работает автономно, мне, вероятно, нет необходимости делать это.Но похоже, что вы будете использовать портал Liferay, где будет много разных банок, поэтому я бы рекомендовал использовать префикс для артефактов.Но я бы не стал перестраивать структуру проекта на основе artifactId.Так что «project-modulename» будет хорошим названием модуля.Поскольку jar-файлы будут создавать путь к классам, а структура зависимостей была определена во время сборки, это не проблема.Если вам нужно перестроить дерево зависимостей на основе списка jar-файлов: maven включает информацию в META-INF (если вы используете release-плагин, который я также рекомендую), чтобы эту информацию можно было получить оттуда.

Я бы также рекомендовал не вкладывать модули глубоко.У Eclipse есть некоторые проблемы с этим (IntelliJ этого не делает, Netbeans afaik также поддерживает вложенные структуры).

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

Для меня это хорошая практика, называть родительские модули суффиксом "-parent".Эти модули редко используются в качестве зависимости, а «-parent» для зависимости может указывать на что-то подозрительное.Как вы сказали: artifacId и имя модуля должны совпадать.Я также рекомендовал бы использовать artifactId в качестве имени в помпе.Некоторые плагины здесь не учитывают различий, и Eclipse ведет себя лучше, если все эти значения одинаковы.

Это правда, что goupId и artifactId часто содержат дублирующую информацию (например, ее части будут именем проекта).Если это было сделано специально или произошло в последние годы ...?Я не знаю, но я бы так и оставил.Артефакты идентифицируются с использованием координат GAV (P) (groupId, artifactId, версия, (упаковка)).Если groupId или artifactId содержат артефакты имени проекта, их легче найти, если у вас есть только один из них.

Найти артефакты легко, если вы используете менеджер репозитория (например, Nexus, Artifactory, Archiva).Поиск часто отображает groupId / artifactId и т. Д., Поэтому поиск «util» даст вам достаточно информации, чтобы найти искомый артефакт.

надеюсь, это немного помогло :) с уважением

wemu

2 голосов
/ 10 марта 2012

Другой возможный подход - смотреть на группы функций больше, чем на иерархию.

Скажем, проект B имеет веб-приложения, плагины и основные библиотеки, тогда все модули имеют один и тот же идентификатор группы (com.mycompany.b) и артефактысоответственно называются webapp-???, plugin-???и core - ???.

Мы также используем соглашение -parent, упомянутое ранее: поэтому родительский POM для всех веб-приложений называется webapp-parent.pom.

...