2010-01-14 14 views
2

Каков наилучший способ установки Maven для проекта с архитектурой SmartClient? Рассмотрим следующие пакеты:Использование Maven для проекта SmartClient

  • myproject.core
  • myproject.server
  • myproject.client

Конечно, есть несколько суб-пакетов в каждом. Клиент и сервер используют ядро. Я вижу два основных варианта:

  1. Сделайте uber-POM в myproject, чтобы покрыть все три и иметь какой-либо параметр сборки, чтобы определить, что нужно построить.
  2. Сделайте POM в каждом пакете выше (один для ядра, другой для сервера и другой для клиента).

Вот выходы нам нужно построить (как минимум):

  • Standalone.jar: Тест приложение, которое будет запускать сервер и клиент.
  • Server.war: WAR-файл, который можно развернуть в Tomcat.
  • Client.jar: SmartClient без кода сервера.

Возможна ли опция №1? Если да, то это хорошая практика? Из моего первоначального исследования вариант № 2 звучит как лучшая практика. Тем не менее, переход от POM к POM, когда весь код тесно связан, звучит как дополнительная работа и лишний беспорядок, который нам может не понадобиться. Должен ли я просто придерживаться опции №2?

ответ

1

У Maven есть общее правило, что для каждого проекта должен быть только один артефакт. Другими словами, опция № 1 не позволит вам создавать server.war, client.jar и т. Д., Не сражаясь с maven. Это будет большой беспорядок, и вы не сможете воспользоваться плагинами maven. Нет, действительно, ты этого не хочешь. Так просто пойти на вариант № 2, со структурой типа (опуская каталог src):

. 
|-- core 
| `-- pom.xml 
|-- server 
| `-- pom.xml 
|-- client 
| `-- pom.xml 
`-- pom.xml 

Относительно Ваше беспокойство по поводу прыжков с POM к POM, ну просто импортировать все модули в вашей IDE, и вы не будете действительно заметьте это. Это очень хорошо работает для многих людей.

UPDATE (для покрытия вопросов из ОП в комментариях):

Борьба с Maven не звучит весело.

Нет, и вы потеряете :)

Что находится в pom.xml на корневом уровне?

Это родительский ПОМ, используемый для Project Aggregation.Цитируя Introduction to the POM документ:

Aggregation Проект похож на наследования проекта. Но вместо , указав родительский POM из модуля , он определяет модули из родительского ПОМ. Таким образом, родительский проект теперь знает свои модули, , и если команда Maven вызывается против родительского проекта, то команда Maven будет затем исполнена в родительских модулях . Для проекта Aggregation, вы должны сделать следующее:

  • Изменения родителя РОМ упаковкой к значению «П».
  • Укажите в родительском ПОМ каталоги своих модулей (дети РОМ)

агрегация проекта и наследование проекта часто используются вместе. Для получения более подробной информации обратитесь к указанному документу.

«Единый артефакт для каждого проекта» означает, что должен быть отдельный POM для Standalone.jar, Server.war и Client.jar (три общих POM)?

Да, это то, что я имею в виду, один проект генерирует один артефакт (есть некоторые исключения, но это верно 99% времени). Это лучшая практика, которую вы должны (должны?) Следовать.

Что делать, если я также хочу использовать Server.jar, простой сервер на основе гризли? Разве сервер не нуждался бы в двух POM?

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

Кроме того, как можно начать сборку, которая приведет к созданию всех трех артефактов?

Запустите команду maven из агрегирующего проекта, как мы видели (он же «сборка нескольких модулей»).

+0

Хорошо сказано. Борьба с Maven не звучит весело. Что находится в pom.xml на корневом уровне? «Единый артефакт для каждого проекта» означает, что должен быть отдельный POM для Standalone.jar, Server.war и Client.jar (три общих POM)? Что делать, если я также хочу Server.jar, простой сервер, основанный на Grizzly? Разве сервер не нуждался бы в двух POM? В очередной раз благодарим за помощь. – User1

+0

Кроме того, как можно начать сборку, которая приведет к созданию всех трех артефактов? – User1

+0

Как увеличить свой ответ дважды? :) – User1

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