Использование Maven для проекта SmartClient - PullRequest
2 голосов
/ 14 января 2010

Как лучше всего настроить 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 Ответ

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

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

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

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

ОБНОВЛЕНИЕ (чтобы охватить вопросы от ОП в комментариях):

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

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

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

Это родительский POM, используемый для Агрегация проекта . Цитата Введение в документ POM :

Агрегирование проекта аналогично Наследование проекта. Но вместо указав родительский POM из модуль, он определяет модули из родитель POM. Таким образом, родительский проект теперь знает свои модули, и если вызывается команда Maven против родительского проекта, что Maven Затем команда будет выполнена родительские модули, а также. Сделать Агрегация проекта, вы должны сделать следующее:

  • Измените родительскую упаковку POM на значение "pom".
  • Укажите в родительском POM каталоги его модулей (дочерние РОМ)

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

Под "одним артефактом на проект" подразумевается ли отдельное POM для Standalone.jar, Server.war и Client.jar (всего три POM)?

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

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

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

Кроме того, как можно начать сборку, в результате которой будут созданы все три артефакта?

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

...