Как управлять мультиприложением в maven? - PullRequest
1 голос
/ 10 октября 2019

В настоящее время я пытаюсь перенести проект с несколькими приложениями с Ant на Maven.
В настоящий момент проект состоит из нескольких пакетов, создающих какое-то дерево зависимостей, без циклических зависимостей. Листья этого дерева представляют собой «прикладные» пакеты, содержащие Main. Промежуточные узлы - это «библиотечные» пакеты, используемые другими библиотечными «пакетами» или «прикладными» пакетами.
Узлам разрешено «расти вместе» до одного узла или листа. Я выяснил, что эти пакеты, вероятно, должны быть сгруппированы в модули maven, и теперь у меня есть структура, подобная этой:

root
    - lib1
    - lib1A (depends on lib1)
    - lib1B (depends on lib1)
    - app1A (depends on lib1A)
    - lib2  (depends on lib1B)
    - lib2A (depends on lib2)
    - lib2B (depends on lib2)
    - app2  (depends on lib2A and lib2B)
    - lib3  (depends on lib2A and lib2B)
    - app3A (depends on lib3)
    - app3B (depends on lib3)

В основном библиотека и приложение могут зависеть от одной или нескольких других библиотек.
Теперь я хотел бы иметь возможность создавать каждое приложение самостоятельно и создавать для него исполняемый jar-файл.
Теперь я пытаюсь сделать следующее:

  • настроитьpom.xml каждого app для использования maven-assembly-plugin для создания исполняемого файла jar.
  • Сборка каждого необходимого модуля для определенного приложения.
  • Сборка модуля приложения, что приводит кисполняемый файл jar.

Таким образом, сборка для app2 будет строить lib1, lib1A и lib1B, lib2, lib2A и lib2B и, наконец, app2.
Однако, чтобы автоматизировать сборку, мне нужно было бы создать скрипт сборки для каждого приложения, который позаботится о создании всех необходимых зависимостей, что maven уже должен сделать сам.
Кроме того, если я хочу собратьнесколько приложений одновременно, мне нужно будет собрать всеl библиотеки несколько раз, или отслеживание уже собранных модулей самостоятельно.
Поскольку я новичок в maven, я не уверен, что это правильный способ управления таким многозадачным проектом.
Поэтому я прошунесколько советов о том, как правильно управлять этим вариантом использования.

РЕДАКТИРОВАТЬ:
Чтобы уточнить, что я хотел бы иметь возможность сделать:

  • buildодно приложение со своими зависимостями, без создания всех приложений (работает maven на родительском pom).
  • создает несколько приложений (не всех) со своими зависимостями, без многократного построения зависимостей.

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

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

Отредактировано: исходный ответ был неверным, после некоторого теста я обнаружил, что может быть полезным следующее: Модули Maven + Построение единственного конкретногоМодуль Вам просто нужно добавить флаги -pl и -am при сборке отдельного модуля из родительского уровня.

0 голосов
/ 05 ноября 2019

Сейчас я использую родительский проект, который определяет версию maven, общие зависимости и общие конфигурации плагинов.
Родительский проект также определяет свои дочерние модули в module -tags.
Каждый дочерний модульссылается на этот родительский проект и использует ту же версию.
Для сборки приложений я запускаю maven внутри родительского проекта с использованием флагов -pl и -am, как указано в в этом комментарии .
Флаг -pl указывает maven собирать только перечисленные модули вместо построения всего проекта.
Флаг -am указывает maven также создавать необходимые зависимости.
Пример:
Заданоследующая структура:

parent
---- lib1
---- lib1A (depends on lib1)
---- lib1B (depends on lib1)
---- lib2 (depends on lib1B)
---- lib2A (depends on lib2)
---- lib2B (depends on lib2)
---- app1A (depends on lib1A)
---- app2A (depends on lib2A)
---- app2B (depends on lib2B)

Выполнение mvn clean install -pl app1A,app2A -am позволит собрать все модули, кроме app2B и lib2B.
Также модуль lib1, который используется app1A и app2A будет построен только один раз.

Обычно вы хотите, чтобы каждый модуль был независимым, но в нашем случае это потребует огромных усилий, так как у нас много модулей, построенных друг на друге. Небольшие изменения в «самом низком» модуле (lib1 в примере) могут привести к изменениям почти в каждом модуле.
Так что в этом случае нам потребуется увеличить номер каждой версии и обновить все ссылочные зависимости во всех модулях.
Вместо этого мы решили всегда перестраивать все зависимости, в результате чего всегда был обновленный Jar. Вот почему мы управляем только версией maven в родительском проекте.

0 голосов
/ 10 октября 2019

Если вы определяете зависимости в соответствующем POM и строите весь проект (на корневом уровне), то Maven автоматически упорядочивает модули топологически, что означает, что каждый модуль собирается один раз, и все выполняется в правильном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...