Erfahrung mit dem Flatten-Maven-Plugin zur Vereinfachung der Versionierung in Maven-Projekten

Über uns

Bei 1C entwickeln wir nicht nur eine Plattform 1C: Unternehmen auf C ++ и JavaScript, sondern auch Java-Anwendungen – insbesondere die neue Entwicklungsumgebung Unternehmensentwicklungstools basierend auf Eclipse und einem tief in die Plattform integrierten Messenger-Server - Interaktionssysteme.

Eintrag

Am häufigsten verwenden wir Maven als Build-System für Java-Anwendungen. In diesem kurzen Artikel möchten wir über eines der Probleme sprechen, mit denen wir bei der Organisation der Entwicklung konfrontiert waren, und über den Ansatz, der es uns ermöglichte, dieses Problem zu überwinden Problem.

Voraussetzungen und Arbeitsablauf

Aufgrund der Besonderheiten der Entwicklung in unseren Maven-Projekten verwenden wir eine ganze Reihe von Modulen, Abhängigkeiten und untergeordneten Projekten. Die Anzahl der POM-Dateien in einem Baum kann Dutzende oder sogar Hunderte betragen.

Erfahrung mit dem Flatten-Maven-Plugin zur Vereinfachung der Versionierung in Maven-Projekten

Es scheint: Keine große Sache, sie haben es einmal erstellt und dann vergessen. Wenn Sie in allen Dateien auf einmal etwas ändern oder hinzufügen müssen, gibt es in Editoren und IDEs viele praktische Tools. Was ist die häufigste regelmäßige Änderung an pom.xml? Wir glauben, dass sich Änderungen in Projektversionen und Abhängigkeiten ergeben. Vielleicht möchte jemand dagegen argumentieren, aber genau das ist bei uns der Fall. Der Grund liegt in der Tatsache, dass wir zusammen mit dem Kernel gleichzeitig viele unserer eigenen Bibliotheken entwickeln und für die ständige Reproduzierbarkeit von Build- und Testergebnissen erscheint uns die Verwendung von Snapshots kein bequemer Ansatz. Aus diesem Grund ist es notwendig, die Versionsnummer in Projekten mit jedem Build zu erhöhen.

Außerdem muss ein Entwickler von Zeit zu Zeit seinen eigenen Zweig einer Bibliothek erstellen und seine Funktionalität anhand aller Abhängigkeiten prüfen, wofür er die Version aller Abhängigkeiten manuell ändern muss.

Erste Lösung

Bei solch häufigen und mehrfachen Versionsänderungen möchte ich den Prozess innerhalb von CI vereinfachen und automatisieren. Hier hilft ein praktisches, bekanntes Plugin. Versionen-Maven-Plugin - Anschließen und starten

mvn -N Versionen:set -DnewVersion=2.0.1

und Maven wird alles so machen, wie es sollte: Es wird die Hierarchie von oben nach unten durchlaufen und alle Versionen ersetzen – Schönheit! Jetzt müssen Sie nur noch eine Pull-Anfrage stellen, die Kollegen überprüfen die Änderungen und Sie können schnell dem Trunk beitreten. Schnell? Egal wie es ist. Ein paar Hundert pom.xml zur Überprüfung, und dies zählt nicht den Code. Darüber hinaus ist niemand vor Zusammenführungskonflikten bei einer so großen Anzahl geänderter Dateien sicher. Hierbei ist zu beachten, dass im CI-Prozess Versionsänderungen automatisch zusammen mit Änderungen der Funktionalität erfolgen und nicht irgendwie separat.

Neue Funktionen

Für eine Weile beruhigten wir uns und resignierten und lebten so, bis die Jungs aus Maven Apache-Projekt Ab Version 3.5.0-beta-1 enthielt Maven keine Unterstützung für sogenannte „Platzhalter“. Das ist das Wesentliche an diesen Ersatzstoffen pom.xml Anstelle einer spezifischen Angabe der Projektversion werden Variablen verwendet ${revision}, ${sha1} и ${Änderungsliste}. Die Werte dieser Eigenschaften selbst werden entweder im Element festgelegtimmobilien>, oder sie können über eine Systemeigenschaft definiert werden

mvn -Drevision=2.0.0 sauberes Paket

Systemeigenschaftswerte haben Vorrang vor den in definierten Wertenimmobilien>.

Elternteil

  4.0.0
  
    org.apache
    Apache
    18
  
  org.apache.maven.ci
  ci-parent
  Erste CI-freundlich
  ${revision}${sha1}${changelist}
  ...
  
    1.3.1
    -SCHNAPPSCHUSS
    
  


Nachkomme

  4.0.0
  
    org.apache.maven.ci
    ci-parent
    ${revision}${sha1}${changelist}
  
  org.apache.maven.ci
  Ci-Kind
   ...

Wenn Sie Version 2.0.0-SNAPSHOT erstellen möchten, dann verwenden Sie einfach

    mvn -Drevision=2.0.0 sauberes Paket

Wenn Sie eine Freigabe vornehmen möchten, setzen Sie SNAPSHOT einfach zurück

    mvn -Dchangelist= sauberes Paket

*Die obigen Beispiele stammen aus Artikel auf der Website des Maven Apache Project

Die harte Realität

Alles ist gut und gesund, es ist Zeit, ein Gefühl der Zufriedenheit zu verspüren, aber nein. Es stellt sich heraus, dass diese Methode für die Installation und Bereitstellung nicht funktioniert, da sie in den Beschreibungen der im Repository veröffentlichten Artefakte nicht ersetzt wird ${revision} über seine Bedeutung und Maven wird nicht mehr verstehen, worum es geht.


    org.apache
    Apache
    ${revision}

Ein Licht am Ende eines Tunnels

Wir müssen nach einer Lösung für das Problem suchen. Hätte die Situation retten können Flatten-Maven-Plugin. Dieses Plugin löst alle Variablen im POM auf, schneidet aber gleichzeitig viele andere Informationen aus, die nur beim Zusammenbau benötigt werden und beim Importieren veröffentlichter Artefakte in andere Projekte nicht benötigt werden. Das Plugin „begradigt“ außerdem alle Eltern-Kind-Abhängigkeiten, und als Ergebnis erhalten Sie einen flachen Pom, der alles enthält, was Sie brauchen. Der Nachteil war, dass zu viel „Extra“ weggelassen wurde, was uns überhaupt nicht gefiel. Nach dem Studium der Informationen zur Entwicklung dieses Plugins stellte sich heraus, dass wir nicht die Einzigen im Universum sind, und bereits im August 2018 wurde auf Github im Plugin-Repository ein Pull-Request erstellt, mit dem Wunsch, dies zu ermöglichen um selbst zu bestimmen, wie wir pom.xml „verderben“ können. Die Entwickler hörten auf die Stimmen der Leidenden und bereits im Dezember erschien mit der Veröffentlichung der neuen Version 1.1.0 ein neuer Modus, „resolveCiFriendliesOnly“, im Flatten-Maven-Plugin, der passender denn je war – er verlässt pom.xml unverändert, mit Ausnahme des Elements und erlaubt ${revision}, ${sha1} и ${Änderungsliste}.

Hinzufügen eines Plugins zum Projekt


  
    org.codehaus.mojo
    Flatten-Maven-Plugin
    1.1.0
    
      WAHR
      gelöstCiFriendliesOnly
    
    
      
        ebnen
        Prozessressourcen
        
          ebnen
        
      
      
        glätten.sauber
        sauber
        
          sauber
        
      
    
  

Fertig!

Glückliches Ende

Um von nun an die Version des gesamten Projekts zu ändern und alle Abhängigkeiten darüber zu informieren, müssen wir nur noch das Element bearbeitenRevision> nur im Stammverzeichnis pom.xml. Nicht hundert oder zwei dieser Dateien mit der gleichen Änderung gelangen zur Überprüfung, sondern eine. Nun, es besteht keine Notwendigkeit, es zu verwenden Versionen-Maven-Plugin.

Source: habr.com

Kommentar hinzufügen