Wie kann die Organisation von maven's DistributionManagement im gesamten Unternehmen angegeben werden?

110

Ich versuche herauszufinden, wie viele (über 50) maven2-Projekte so organisiert werden können, dass sie in einem zentralen Nexus-Repository bereitgestellt werden können. Wenn Sie das mvn deployZiel verwenden, müssen Sie das Ziel im DistributionManagement-Tag wie folgt angeben:

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

Jetzt möchte ich nicht, dass jede einzelne pom.xml (von diesen 50+) diesen Block immer und immer wieder enthält. Mein erstes wäre zwar die settings.xmlDatei, aber es scheint nicht möglich zu sein, sie dort zu definieren. Die erste Frage wäre also, warum das so ist. Wenn es möglich wäre, könnte ich es in der settings.xml in der maven2-Distribution angeben, die an alle Entwickler verteilt werden könnte.

Die einzig mögliche Lösung, die ich gefunden habe, bestand darin, ein organisationsweites Master-Pom-Projekt zu erstellen, das diese Einstellungen enthält, und alle anderen pom.xml über das <parent>Tag von diesem Master-Pom abhängig zu machen . Bei Builds mit mehreren Modulen sieht dies jedoch seltsam aus:

- 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)

Normalerweise lese ich in der gesamten Dokumentation, dass die Modul-Poms den übergeordneten Pom verwenden sollten, nicht einen anderen. Aber nach dem Lesen der Maven-Website über Inheritance v. Aggregation steht geschrieben, dass dies tatsächlich möglich ist.

Ein Problem, das ich gefunden habe, war die Generierung der Maven-Site, die anscheinend Probleme mit diesem Setup hat (Module werden nicht richtig verknüpft, wenn sie keinen direkten Rückverweis haben).

Ist das also ein gültiger Ansatz? Gibt es eine andere, offensichtlichere und einfachere Lösung für das Problem?

mglauche
quelle
5
@OhadR: Sie schreiben nur, wie man es in einem Projekt schreibt. Punkt ist, dass ich es nicht ungefähr 500 Mal duplizieren wollte ...
mglauche
1
Aha. Punkt genommen. Wie derjenige, der geantwortet hat, sagte, können Sie einen Haupt-Pom für das Projekt haben, der die 'DistribMngmnt' enthält ...
OhadR

Antworten:

144

Die beste Lösung hierfür besteht darin, ein einfaches übergeordnetes POM-Dateiprojekt (mit der Verpackung 'POM') generisch für alle Projekte Ihrer Organisation zu erstellen.

<?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>

Dies kann erstellt, freigegeben und in Ihrem lokalen Nexus bereitgestellt werden, sodass jeder Zugriff auf sein Artefakt hat.

Fügen Sie nun für alle Projekte, die Sie verwenden möchten, einfach diesen Abschnitt hinzu:

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

Mit dieser Lösung können Sie allen Projekten Ihres Unternehmens auf einfache Weise weitere allgemeine Elemente hinzufügen. Wenn Sie beispielsweise Ihre JUnit-Nutzung auf eine bestimmte Version standardisieren möchten, ist dies der perfekte Ort dafür.

Wenn Sie Projekte haben, die Strukturen mit mehreren Modulen verwenden, die über ein eigenes übergeordnetes Element verfügen, unterstützt Maven auch die Verkettung der Vererbung, sodass es durchaus akzeptabel ist, die übergeordnete POM-Datei Ihres Projekts auf das übergeordnete POM Ihres Unternehmens zu verweisen und die untergeordneten Module des Projekts nicht einmal über Ihre zu informieren Muttergesellschaft des Unternehmens.

Ich sehe aus Ihrer Beispielprojektstruktur, dass Sie versuchen, Ihr übergeordnetes Projekt auf die gleiche Ebene wie Ihr Aggregator-POM zu bringen. Wenn Ihr Projekt ein eigenes übergeordnetes Element benötigt, besteht der beste Ansatz darin, das übergeordnete Element auf derselben Ebene wie die übrigen Module einzuschließen und Ihre Aggregator-Datei pom.xml im Stammverzeichnis der Verzeichnisse aller Module zu haben.

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

Mit dieser Struktur nehmen Sie Ihr übergeordnetes Modul in den Aggregator auf und erstellen alles mit einem mvn installaus dem Stammverzeichnis.

Wir verwenden genau diese Lösung in meiner Organisation und sie hat sich bewährt und hat für uns recht gut funktioniert.

Jesse Webb
quelle
Hier ist eine weitere Antwort, in der ich die Projektvererbung ausführlicher beschreibe und wie man die Komplexität der Vererbung verwaltet. Verzeihen Sie das Wortspiel. ;) stackoverflow.com/questions/6347913
Jesse Webb
7
Nur eine kleine Anmerkung: Aus den Gründen, warum die Muttergesellschaft des Unternehmens die beste Lösung ist, lesen Sie die Diskussion Kann DistributionManagement in settings.xml in der Liste der Maven-Benutzer nicht angeben .
Premek Brada
Im klassischen Beratungsmodell, bei dem "Kunde den Code besitzt", muss mein Entwicklungsteam das Projekt außerhalb des Standorts bearbeiten und dann den neuesten Code zum Kundenstandort bringen und erneut erstellen. Wenn ich in meiner Situation mit einem Projekt mit mehreren Modulen auf das Firmen-POM im übergeordneten Projekt-POM verweise, muss ich diesen Verweis aktualisieren, um auf das Firmen-POM des Kunden zu verweisen. Ich möchte lieber alle umgebungsspezifischen Einstellungen in settings.xml beibehalten, wenn ich helfen kann. Was ist der empfohlene Ansatz für meine Situation?
Web User
2
@WebUser Ihr Problem klingt eher nach einer Situation, in der Sie andere Werte in Ihren POM-Dateien benötigen, als in dieser Antwort: Vermeiden Sie doppelte Einstellungen über mehrere Module hinweg. Ich denke, Sie sollten versuchen, Eigenschaften über eine settings.xml-Datei zu injizieren . Wenn Ihnen das nicht hilft, stellen Sie hier auf SO eine neue Frage, verlinken Sie hier, und ich werde versuchen, Ihnen weiter zu helfen.
Jesse Webb
Danke @JesseWebb Am Ende habe ich das ausprobiert und es ist nützlich, diese Werte für die von mir beschriebene Situation vom POM weg zu abstrahieren. Für meine Anforderungen habe ich relevante Eigenschaften unter dem aktiven Profil und die im POM aufgelösten hinzugefügt.
Web User
36

Es ist kein übergeordnetes POM erforderlich.

Sie können den DistributionManagement-Teil vollständig in Ihren Poms weglassen und entweder auf Ihrem Build-Server oder in settings.xml festlegen.

Um dies auf dem Build-Server zu tun, übergeben Sie einfach den mvnBefehl:

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

Weitere Informationen zu den einstellbaren Optionen finden Sie unter https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html .

Es ist auch möglich, dies in Ihrem zu setzen settings.xml.

Erstellen Sie dort einfach ein Profil, das aktiviert ist und die Eigenschaft enthält.

Beispiel settings.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>

Stellen Sie sicher, dass sich die Anmeldeinformationen für "Snapshots" und "Releases" im <servers>Abschnitt Ihrer settings.xml befinden

Die Eigenschaften altSnapshotDeploymentRepository und altReleaseDeploymentRepository werden mit der Version 2.8 des Maven-Deployment-Plugins eingeführt. Ältere Versionen schlagen mit der Fehlermeldung fehl

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

Um dies zu beheben, können Sie eine neuere Version des Plug-Ins erzwingen:

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>
Michael Wyraz
quelle
Ich versuche diese Lösung ständig, aber nur die Eigenschaft altDeploymentRepository funktioniert. altReleaseDeploymentRepository und altSnapshotDeploymentRepository werden nicht erkannt und es wird folgende Fehlermeldung angezeigt : Bereitstellung fehlgeschlagen: Das Repository-Element wurde im POM im DistributionManagement-Element oder im Parameter -DaltDeploymentRepository = id :: layout :: url nicht angegeben. Jeder Vorschlag würde helfen. Vielen Dank
Shabirmean
@Shabirmean Der Grund ist eine zu alte Version des Bereitstellungs-Plug-Ins. Ich habe meine Antwort mit einer Lösung erweitert.
Michael Wyraz
Ja, ich habe es mir gedacht. Vielen Dank :)
Shabirmean