Использование Maven для проекта SmartClient

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

  • мой проект.ядро
  • мой проект.сервер
  • мой проект.клиент

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

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

Вот результаты, которые нам нужно построить (как минимум):

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

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


person User1    schedule 14.01.2010    source источник


Ответы (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, и вы этого не заметите. Это просто очень хорошо работает для многих людей.

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

Сражаться с Мейвеном не весело.

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

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

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

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

  • Измените упаковку родительских POM на значение «pom».
  • Укажите в родительском POM каталоги его модулей (дочерние POM)

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

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

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

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

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

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

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

person Pascal Thivent    schedule 14.01.2010
comment
Хорошо сказано. Сражаться с Мейвеном не весело. Что находится в pom.xml на корневом уровне? Под одним артефактом на проект вы подразумеваете, что должен быть отдельный POM для Standalone.jar, Server.war и Client.jar (всего три POM)? Что, если я также хочу Server.jar, простой сервер на основе Grizzly? Разве серверу не нужны два POM? В очередной раз благодарим за помощь. - person User1; 15.01.2010
comment
Кроме того, как запустить сборку, в результате которой будут созданы все три артефакта? - person User1; 15.01.2010
comment
Позвоните друзьям :)) Рад, что вы нашли это полезным. - person Pascal Thivent; 15.01.2010