Как настроить maven для двух отдельных проектов, которые зависят от одной банки - PullRequest
3 голосов
/ 26 октября 2009

Если на этот вопрос ответили где-то еще, пожалуйста, шлепни меня и укажи мне правильное направление.

Я новичок в Maven и пытаюсь понять, как использовать его в своих проектах. У меня есть два проекта верхнего уровня, одно приложение Swing, другое - набор веб-сервисов. Они оба зависят от одной и той же внутренней банки. Каковы хорошие способы настроить poms для этого?

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

Один из способов, как я мог бы это сделать, - это иметь главный pom для приложения Swing, в котором приложение Swing и библиотека jar являются модулями. Затем настройте другой мастер-модуль для веб-приложения таким же образом. Будет ли это иметь смысл? Есть ли лучшие способы?

Структура каталогов в настоящее время очень проста:

Development/  
----SwingApp/  
----WebServices/  
----CoreLibrary/  

Слишком много информации и дополнительных вопросов:

Я унаследовал «систему сборки» (используя термин «свободно»), которая представляет собой 100% автоматически генерируемые Ant-скрипты Netbeans. Я начал пытаться внедрить его в систему непрерывной интеграции TeamCity, которая мне действительно нравится. Я столкнулся с серьезными проблемами, пытаясь построить проект WebServices с его помощью. В сгенерированном муравье (build-impl.xml) есть вещи, которые, насколько я могу судить, не могут быть переопределены в среде CI. Объедините это с серьезным адским занятием в повседневной разработке, и вы начинаете понимать, почему я хочу пойти в Maven.

Одной из проблем, поднятых в этом вопросе, является привычка разработчиков в моей команде. Прямо сейчас различные проекты в Netbeans имеют ссылки на проект «CoreLibrary». Это означает, что когда источник изменяется в «CoreLibrary» и разработчик выполняет сборку приложения верхнего уровня, он также будет создавать CoreLibrary по мере необходимости. Это может быть смоделировано в Maven? Это пошло бы способами облегчить переход. Пока что я вижу, что Netbeans (6.7) не делает этого с maven-сборками, и я не думаю, что смогу (пока) продавать свою работу за пределами Netbeans.

Ответы [ 5 ]

6 голосов
/ 27 октября 2009

В вашем каталоге разработки вы бы имели 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 для построения только webServices и их зависимостей (в данном случае coreLibrary)

mvn -am --projects webServices clean install 
3 голосов
/ 27 октября 2009

Технически, есть несколько решений для реализации этой сборки, но, в зависимости от связи между этим проектом и их жизненными циклами, вы можете в конечном итоге выбрать один или другой вариант. Некоторые вопросы могут помочь решить:

  • Кто строит все эти проекты? Уникальная команда? Отдельные команды?
  • Есть ли какие-либо отношения между SwingApp и веб-сервисами? Когда вы создаете SwingApp, имеет ли смысл создавать WebServices? Когда вы выпускаете SwingApp, вы тоже выпускаете веб-сервисы? Всегда ли проекты SwingApp и WebServices используют одну и ту же версию CoreLibrary?
  • Имеет ли смысл строить 3 проекта вместе?
  • Имеет ли смысл собирать CoreLibrary отдельно и оба проекта зависят от созданного jar?

Исходя из предоставленной информации, я понимаю (что может быть неправильно, это просто интерпретация), что все 3 проекта фактически тесно связаны и разрабатываются в одно и то же время одними и теми же людьми. Когда базовая библиотека модифицируется, зависимый проект перестраивается. Итак, я бы предложил следующий мультимодульный проект:

my-app/           // this is the parent module, it aggregates the child modules  
|-- pom.xml       
|-- core-library  
|   `-- pom.xml   
|-- swing-app     // this module has a dependency on core-library  
|   `-- pom.xml   
`-- web-services  // this module has a dependency on core-library  
    `-- pom.xml   

Идея состоит в том, чтобы поместить все проекты в родительский модуль и использовать как агрегацию, так и наследование проектов:

  • Родительский проект будет использоваться для объединения дочерних модулей. Он имеет упаковку типа pom и объявляет элемент <modules>, содержащий все 3 дочерних модуля. Таким образом, родительский проект теперь знает свои модули, и если команда Maven вызывается для родительского проекта, эта команда Maven будет также выполняться для родительских модулей.
  • Каждый дочерний модуль объявит родительский проект как <parent>. Это полезно для наследования общей части от родительского pom
  • Модули swing-app и web-services будут иметь <dependency> на ядре-библиотеке, объявленной в их pom. Во время многомодульной сборки зависимости используются maven для расчета порядка сборки.

При такой настройке core-library будет создана до swing-app и web-services при запуске Maven из верхнего проекта (это называется сборкой нескольких модулей или сборкой реактора), что представляется желаемым поведением. Таким образом, это похоже на реальную ситуацию без грязного локального управления JAR-файлами (в maven зависимости управляются через «локальный репозиторий», и это встроенная функция).

Примечание. Если NetBeans не нравится вложенные модули, можно использовать плоскую разметку, подобную этой (но пока это более подробно):

my-app/           
|-- parent
|   `-- pom.xml       
|-- core-library  
|   `-- pom.xml   
|-- swing-app     
|   `-- pom.xml   
`-- web-services  
    `-- pom.xml   

Для получения подробной информации о реализации Multi Module Project с Eclipse может помочь вам начать работу очень быстро, просто пропустите определенные шаги Eclipse. Или ознакомьтесь с главой 6. Мультимодульный проект книги Сонатипа Maven для «настоящего» справочника.

3 голосов
/ 27 октября 2009

Вы не должны добавлять .jars в свои проекты. Вы должны добавить JAR-зависимости в ваши файлы .pom. Maven загрузит .jars для вас. Вам придется создавать файлы .pom для каждого внутреннего .jar и добавлять их в свой репозиторий maven (или прокси, если он у вас есть).

0 голосов
/ 27 октября 2009

У меня есть два проекта верхнего уровня, один - приложение Swing, другой - набор веб-сервисов. Они оба зависят от одной и той же внутренней банки.

Вы используете свой собственный репозиторий Maven? Если это так, самый простой вариант - просто развернуть общий внутренний JAR-файл, и оба проекта зависят от JAR-файла, используя элемент <dependency> в POM.

Nexus - это действительно отличный и простой в использовании репозиторий. Если вы собираетесь использовать Maven внутри компании, вам, несомненно, захочется запустить свой собственный репозиторий, чтобы вы могли "выпустить" версии каждый проект, библиотеки JAR и т. д. Управление репозиторием с помощью Nexus - это бесплатная книга от Sonatype, в которой подробно рассказывается, как ее использовать, передовые практики и т. д.

0 голосов
/ 26 октября 2009

Пусть каждое приложение и библиотека jar являются модулем внутри тривиального родителя. Пусть оба приложения зависят от ядра, и maven определит порядок сборки.

...