Как настроить 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, в которой подробно рассказывается, как ее использовать, передовые практики и т. Д.

Другие вопросы по тегам