Як визначити організацію розповсюдження управління Maven в цілому?


110

Я намагаюся розібратися, як організувати багато (близько 50+) проектів maven2, щоб вони могли розгорнутись у центральному сховищі Nexus. Під час використання mvn deployцілі потрібно вказати ціль у тезі розподілу управління таким чином:

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>

Тепер я не хочу, щоб кожен pom.xml (з цих 50+) містив цей блок знову і знову. Перший мій би був settings.xmlфайл, але, здається, це неможливо (за задумом) визначити його там. Отже, перше питання було б, чому це так? Якщо це можливо, я міг би вказати його в settings.xml в дистрибутиві maven2, який можна було б поширити всім розробникам.

Єдине можливе рішення, яке я знайшов, - створити проект на рівні організації master pom, який містить ці налаштування, і зробити так, щоб усі інші pom.xml залежали від цього master-pom через <parent>тег. Але це виглядає дивним чином у багатомодульних збірках:

- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
    - Project 1 module pom (with pm as parent)
    - Project 2 module pom (with pm as parent)

Зазвичай я читаю у всій документації, що модулі poms повинні використовувати батьківський pom, а не якийсь інший. Але після прочитання веб-сайту Maven про наслідування проти агрегації написано, що це дійсно можливо.

Одна з проблем, яку я виявила, була з генерацією сайту Maven, яка, схоже, має проблеми з цією установкою (модулі не зв’язуються правильно, якщо вони не мають прямого зворотного посилання)

Отже, чи це правильний підхід? Будь-яке інше, більш очевидне, простіше рішення проблеми?



5
@OhadR: Вони пишуть лише, як це написати в одному проекті. Справа в тому, що я не хотів копіювати його близько 500 разів ...
mglauche

1
я бачу. точка взята. тому, як сказав той, хто відповів, ви можете мати головну помпо для проекту, яка буде містити 'distribuMngmnt' ...
OhadR

Відповіді:


144

Найкращим рішенням для цього є створення простого батьківського проекту з файлами пам’яті (з упаковкою 'pom') загалом для всіх проектів вашої організації.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>your.company</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <distributionManagement>
        <repository>
            <id>nexus-site</id>
            <url>http://central_nexus/server</url>
        </repository>
    </distributionManagement>

</project>

Це можна створити, випустити та розгорнути до локального зв’язку, щоб кожен мав доступ до його артефакту.

Тепер для всіх проектів, які ви хочете ним використати, просто включіть цей розділ:

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>

Це рішення дозволить вам легко додати інші загальні речі до всіх проектів вашої компанії. Наприклад, якщо ви хочете стандартизувати своє використання JUnit до певної версії, це було б ідеальним місцем для цього.

Якщо у вас є проекти, які використовують багатомодульні структури, у яких є власний батько, Maven також підтримує ланцюжок успадкування, тому цілком прийнятно зробити так, щоб файл батьківського проекту вашого проекту посилався на батьківський пом вашої компанії і дочірні модулі проекту навіть не знали про ваш батьківська компанія.

З вашої прикладної структури проекту я бачу, що ви намагаєтесь поставити батьківський проект на той самий рівень, що і ваш агрегатор пом. Якщо вашому проекту потрібен власний батько, найкращий підхід, який я знайшов, - це включити батьківський рівень на тому ж рівні, що і інші модулі, і ваш файл агрегатора pom.xml в корені, де існують всі каталоги ваших модулів.

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

Що ви робите з цією структурою, це включити ваш батьківський модуль в агрегатор і створити все за допомогою mvn install кореневого каталогу.

Ми використовуємо це точне рішення в моїй організації, і воно витримало перевірку часом і спрацювало досить добре для нас.


Ось ще одна відповідь, де я більш детально описую спадщину проекту та як керувати його складністю успадкування, вибачте за каламбур. ;) stackoverflow.com/questions/6347913
Джессі Вебб

7
Лише невелика примітка: з причин, чому компанія-батьків є найкращим рішенням, дивіться дискусію Не вдається вказати розпорядження дистрибуції в налаштуваннях.xml зі списку користувачів Maven.
Премек Брада

У класичній консалтинговій моделі, в якій "клієнт володіє кодом", моїй розробникові потрібно буде працювати над проектом за межами сайту, а потім перенести останній код на сайт клієнта та створити його заново. У моїй ситуації, працюючи з мультимодульним проектом, якщо я посилаюсь на компанію POM в батьківському проекті POM, мені доведеться оновити це посилання, щоб вказати на компанію POM клієнта. Я б швидше прагну підтримувати всі налаштування для оточуючих у settings.xml, якщо я можу допомогти. Який рекомендований підхід для моєї ситуації?
Веб-користувач

2
@WebUser Ваша проблема скоріше нагадує ситуацію, коли у ваших файлах POM потрібні різні значення на відміну від того, на що відповідає ця відповідь: уникати дублюваних налаштувань для декількох модулів. Я думаю, вам слід спробувати ввести властивості через файл settings.xml . Якщо це не допоможе вам, задайте нове запитання тут, так, посилання на нього тут, і я спробую надалі допомогти вам.
Джессі Вебб

Дякую @JesseWebb Я все-таки спробував це, і корисно абстрагувати ці значення подалі від POM для ситуації, яку я описав. Для моїх потреб я додав відповідні властивості під активним профілем та ті, які вирішено в POM.
Веб-користувач

36

У батьківського POM немає потреби.

Ви можете повністю опустити частину DistributionManagement у вашій команді та встановити її на своєму сервері збірки або в налаштуваннях.xml.

Для цього на сервері збірки просто перейдіть до mvnкоманди:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

Детальну інформацію про параметри можна встановити на веб-сайті https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html .

Це також можна встановити у своєму settings.xml.

Просто створіть там профіль, який увімкнено і містить властивість.

Приклад налаштування.xml:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

Переконайтеся, що облікові дані для "знімків" та "релізів" знаходяться в <servers>розділі ваших settings.xml

Властивості altSnapshotDeploymentRepository та altReleaseDeploymentRepository вводяться з maven-implemen-plugin версії 2.8. Старіші версії не зможуть отримати повідомлення про помилку

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

Щоб виправити це, ви можете застосувати нову версію плагіна:

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>

Я постійно намагаюся це рішення, але працює лише властивість altDeploymentRepository . altReleaseDeploymentRepository та altSnapshotDeploymentRepository не розпізнаються, і я отримую цю помилку: Розгортання не вдалося: елемент репозиторію не вказано в елементі POM всерединіManagement управління або в -DaltDeploymentRepository = id :: layout :: параметр url. Будь-яка пропозиція допоможе. Дякую
Shabirmean

@Shabirmean Причиною є занадто стара версія версії плагіна. Я розширив свою відповідь рішенням.
Michael Wyraz

Так, я зрозумів. Велике спасибі :)
Shabirmean
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.