Как настроить maven для двух отдельных проектов, которые зависят от одной банки
Если на этот вопрос ответят где-то еще, будь добр, накажи меня и укажи мне правильное направление.
Я новичок в Maven и пытаюсь понять, как использовать его в своих проектах. У меня есть два проекта верхнего уровня: одно приложение Swing, другое - набор веб-сервисов. Они оба зависят от одной и той же внутренней банки. Каковы хорошие способы настроить poms для этого?
Если банку использовал только один из проектов, то, похоже, я бы переместил ее внутрь и сделал модулем. Но я не хочу двух (и более поздних) копий исходного кода этой банки.
Один из способов, как мне кажется, это сделать - создать мастер-приложение для приложения Swing, в котором в качестве модулей есть приложение Swing и библиотека jar. Затем настройте другой мастер-модуль для веб-приложения таким же образом. Будет ли это иметь смысл? Есть ли лучшие способы?
Структура каталогов в настоящее время очень проста:
Development/
----SwingApp/
----WebServices/
----CoreLibrary/
Слишком много информации и побочных вопросов:
Я унаследовал "систему сборки" (используя термин "свободно"), которая представляет собой 100% автоматически генерируемые скрипты Ant NetBeans. Я начал пытаться внедрить его в систему непрерывной интеграции TeamCity, которая мне действительно нравится. Я столкнулся с серьезными проблемами, пытаясь построить проект Web Services с его помощью. В сгенерированном муравье (build-impl.xml) есть вещи, которые, насколько я могу судить, не могут быть переопределены в среде CI. Объедините это с серьезным адом в повседневной разработке, и вы начинаете понимать, почему я хочу пойти в Maven.
Одна из проблем, поднятых в этом вопросе, - это привычка разработчиков в моей команде. Прямо сейчас различные проекты в Netbeans имеют ссылки на проект "CoreLibrary". Это означает, что когда источник изменяется в "CoreLibrary" и разработчик выполняет сборку приложения верхнего уровня, он также будет создавать CoreLibrary по мере необходимости. Это может быть смоделировано в Maven? Это пошло бы способами облегчить переход. До сих пор я вижу, что Netbeans (6.7) не делает этого с сборками maven, и я не думаю, что смогу продавать (пока), выполняя ежедневную работу по сборке за пределами Netbeans.
5 ответов
В вашем каталоге разработки у вас будет pom, который будет выглядеть примерно так:
<project>
<groupId>yourGroup</groupId>
<artifactId>project</artifactId>
<packaging>pom</packaging>
<modules>
<module>coreLibrary</module>
<module>swingApp</module>
<module>webServices</module>
</modules>
</project>
да, я пропустил некоторые другие элементы, поэтому заполните все остальное, что вам нужно для полной помпы.
Затем каждый из модулей coreLibrary, swingApp и webServices будет иметь pom с родительским элементом и любые зависимости, как показано ниже.
<project>
<parent>
<groupId>yourGroup</groupId>
<artifactId>project</artifactId>
<version>yourVersion</version>
</parent>
<artifactId>webServices</artifactId>
<packaging>war</packaging>
<version>yourVersion</version>
<dependencies>
<dependency>
<groupId>yourGroup</groupId>
<artifactId>coreLibrary</artifactId>
<version>yourVersion</version>
</dependency>
</dependencies>
</project>
Если вы соберете на корневом уровне, он соберет все 3 модуля, или, что еще лучше, вы можете использовать опцию --also-make для сборки только веб-сервисов и их зависимостей (в данном случае coreLibrary)
mvn -am --projects webServices clean install
Технически, есть несколько решений для реализации этой сборки, но, в зависимости от связи между этими проектами и их жизненными циклами, вы можете в конечном итоге выбрать один или другой вариант. Некоторые вопросы могут помочь решить:
- Кто строит все эти проекты? Уникальная команда? Отдельные команды?
- Есть ли какие-либо отношения между SwingApp и веб-сервисами? Когда вы создаете SwingApp, имеет ли смысл создавать WebServices? Когда вы выпускаете SwingApp, вы тоже выпускаете веб-сервисы? Всегда ли проекты SwingApp и WebServices используют одну и ту же версию CoreLibrary?
- Имеет ли смысл строить 3 проекта вместе?
- Имеет ли смысл собирать CoreLibrary отдельно, и оба проекта зависят от созданного jar?
Исходя из предоставленной информации, я понимаю (что может быть неправильно, это просто интерпретация), что все 3 проекта фактически тесно связаны и разрабатываются в одно и то же время одними и теми же людьми. Когда базовая библиотека модифицируется, зависимый проект перестраивается. Итак, я бы предложил следующий мультимодульный проект:
my-app / // это родительский модуль, он объединяет дочерние модули | - pom.xml |- ядро-библиотека | `- pom.xml | - swing-app // этот модуль зависит от core-библиотеки | `- pom.xml `- веб-сервисы // этот модуль зависит от core-библиотеки `- pom.xml
Идея состоит в том, чтобы поместить все проекты в родительский модуль и использовать агрегацию и наследование проектов:
- Родительский проект будет использоваться для объединения дочерних модулей. Имеет упаковку типа
pom
и объявить<modules>
элемент, содержащий все 3 дочерних модуля. Таким образом, родительский проект теперь знает свои модули, и если команда Maven вызывается для родительского проекта, эта команда Maven будет затем также выполняться для родительских модулей. - Каждый дочерний модуль объявит родительский проект как
<parent>
, Это полезно для наследования общей части от родительского pom - Модули Swing-приложения и веб-сервисов будут иметь
<dependency>
на ядро-библиотека заявлена в их пом. Во время многомодульной сборки зависимости используются maven для расчета порядка сборки.
При такой настройке базовая библиотека будет собираться до начала работы Swing-приложения и веб-сервисов при запуске Maven из верхнего проекта (это называется сборкой из нескольких модулей или сборкой реактора), что, по-видимому, является желаемым поведением. Таким образом, это похоже на реальную ситуацию без грязного локального управления JAR-файлами (в случае maven зависимости управляются через "локальный репозиторий", и это встроенная функция).
Примечание. Если NetBeans не нравится вложенные модули, можно использовать плоскую разметку, подобную этой (но пока это более подробно):
мое-приложение / |- родитель | `- pom.xml |- ядро-библиотека | `- pom.xml | - свинг-приложение | `- pom.xml `- веб-сервисы `- pom.xml
Для получения подробной информации о реализации Multi Module Project с Eclipse может помочь вам начать работу очень быстро, просто пропустите конкретные шаги Eclipse. Или ознакомьтесь с главой 6. Мультимодульный проект книги Сонатипа Maven, где вы найдете "настоящий" справочник.
Вы не должны добавлять.jars в свои проекты. Вы должны добавить JAR-зависимости в ваши файлы.pom. Maven загрузит.jars для вас. Вам придется создавать файлы.pom для каждого внутреннего.jar и добавлять их в свой репозиторий maven (или прокси, если он у вас есть).
Пусть каждое приложение и библиотека jar будут модулем внутри тривиального родителя. Пусть оба приложения зависят от ядра, и maven определит порядок сборки.
У меня есть два проекта верхнего уровня: одно приложение Swing, другое - набор веб-сервисов. Они оба зависят от одной и той же внутренней банки.
Вы используете свой собственный репозиторий Maven? Если это так, самый простой вариант - просто развернуть общий внутренний JAR-файл, и оба проекта зависят от JAR, используя <dependency>
элемент в POM.
Nexus - это действительно отличный и простой в использовании репозиторий, если вы собираетесь использовать Maven самостоятельно, вы, несомненно, захотите запустить свой собственный репозиторий, чтобы вы могли на самом деле "выпускать" версии каждого проекта, библиотеки JAR и т. Д. Репозиторий Управление с Nexus - это бесплатная книга от Sonatype, в которой подробно рассказывается, как ее использовать, передовые практики и т. Д.