Maven: объединить веб-проекты - PullRequest
5 голосов
/ 14 января 2010

У меня настроены следующие проекты Maven:

  • PM-Core
  • PM-Web (с зависимостью от PM-Core)
Теперь этот проект используется для нескольких клиентов, но для каждого клиента есть некоторые небольшие различия: в основном различия в файлах конфигурации, но некоторым клиентам также требуются дополнительные файлы Java (которые могут не быть установлены для других клиентов).

Я рассматривал несколько вариантов поддержки этого с maven, но все еще ищу идеальное решение.

Лучшее решение, которое я могу придумать, - это создать отдельный проект maven для каждого клиента (например, PM-CLIENT1, ...), который содержит только специфичные для клиента файлы конфигурации и дополнительные файлы java или jsp, .... Следующим шагом будет рассмотрение проекта PM-Web и проекта клиента как одного веб-проекта, что означает: объединить (упаковать) их в 1 файл war с файлами из проекта клиента, имеющими приоритет над файлами из проекта PM-Web.

Более конкретно: запуск mvn package на PM-Client1 будет брать все из PM-Web, добавлять / заменять файлы из PM-Client1 и затем упаковывать это в одну войну.

Итак, вопрос в том, как этого добиться с помощью Maven?

Ответы [ 3 ]

4 голосов
/ 14 января 2010

Да, это можно сделать, используя Наложения . Пример на веб-странице - именно то, о чем вы говорите.

Для структуры проекта у вас может быть что-то вроде этого:

.
|-- PM-Core
|-- PM-WebCommon (of type war, depends on core)
|-- PM-Client1 (of type war, depends on webcommon)
`-- PM-Client2 (of type war, depends on webcommon)

И используйте оверлей в PM-Client1 и PM-Client2, чтобы «объединить» их с PM-WebCommon и пакетными войнами для каждого клиента.

ОБНОВЛЕНИЕ Я не буду охватывать все детали, но я думаю, что объявление зависимости войны с областью действия типа runtime требуется при использовании наложения, именно так работает наложение (фактически, вся штука с оверлеем это своего рода хак). Теперь, чтобы решить проблему с затмением, одним из решений будет создание JAR, содержащего классы проекта PM-WebCommon. Для этого используйте необязательный параметр attachClasses и установите для него значение true. Это скажет maven создать PM-WebCommon-<version>-classes.jar, который вы затем сможете объявить как зависимость в PM-Client1 (с областью действия provided). Для получения более подробной информации, посмотрите MWAR-73 и MWAR-131 . Это также обсуждается в FAQ плагина войны. Обратите внимание, что это не рекомендуемая практика, правильным способом было бы перенести классы в отдельный модуль (и это другое решение, которое я хотел упомянуть).

ОБНОВЛЕНИЕ (201001018): я пробовал параметр attachClasses, и он работает с версией 2.1-бета-1 плагина.

1 голос
/ 14 января 2010

Сравните также ответы на вопрос различные файлы WAR, общие ресурсы .

1 голос
/ 14 января 2010

Вы можете использовать профили см. http://maven.apache.org/guides/mini/guide-building-for-different-environments.html и использовать классификаторы , чтобы отличать артефакты от разных сборок для одной и той же версии. В этой настройке вы можете создать дополнительные необязательные модули для каждой из ваших специфических настроек ваших клиентов в рамках родительского проекта, т.е.
+ PM
++ PM-Core
++ PM-Web
++ PM-Client1
++ PM-Client2

Или вы можете посмотреть, используя плагин сборки maven

...