Erfarenhet av att använda flatten-maven-plugin för att förenkla versionering i maven-projekt

Alconost arbetar professionellt med

På 1C utvecklar vi inte bara plattformen 1C: Företag till C++ och JavaScript, utan även applikationer på Java – speciellt en ny utvecklingsmiljö Enterprise Development Tools baserad på Eclipse och servern är djupt integrerad med plattformens meddelandetjänst – Interaktionssystem.

Inledning

Som byggsystem för Java-applikationer använder vi oftast Maven, och i denna korta artikel vill vi berätta om ett av de problem som vi stött på i utvecklingsorganiseringen och om den metod som gjorde det möjligt att övervinna problemet.

Förutsättningarna och arbetsflödet

Med hänsyn till särdragen i utvecklingen i våra Maven-projekt använder vi ganska många moduler, beroenden och underprojekt. Antalet pom-filer i ett enda träd kan räknas i dussin och till och med hundratals.

Erfarenhet av att använda flatten-maven-plugin för att förenkla versionering i maven-projekt

Det verkar inte vara så farligt – vi skapar dem en gång och glömmer dem. Om man behöver ändra eller lägga till något i alla filer på en gång finns det gott om användbara verktyg i redigerare och IDE. Men vad är den vanligaste regelbundna förändringen av pom.xml? Vi tror att det handlar om att ändra versioner av projektet och beroendena. Kanske kommer någon att vilja diskutera detta, men så här ser det ut för oss. Anledningen är att vi parallellt utvecklar många egna bibliotek vid sidan av kärnan, och för att ständigt reproducera resultaten av bygg och testning är användningen av snapshots inte ett bekvämt tillvägagångssätt för oss. Därför måste vi höja versionsnumret i projekten vid varje byggen.

Utvecklaren har också ibland behov av att bygga sin egen gren av något bibliotek och kontrollera dess funktionalitet för alla beroenden, vilket innebär att man manuellt får ändra versionen i alla dessa.

Den initiala lösningen

Med så frekventa och många förändringar av versioner vill man förenkla och automatisera processen inom CI. Här kommer en användbar och välkänd plugin till hjälp versions-maven-plugin – vi kopplar in den och kör

mvn -N versions:set -DnewVersion=2.0.1

och Maven gör allt som det ska: det går igenom hierarkin uppifrån och ner, byter ut alla versioner – vackert! Nu återstår det bara att skicka upp en pull-request, kollegorna granskar ändringarna, och så kan man snabbt gå med i trunk. Snabbt? Kanske inte. Några hundra pom.xml för recension, och detta utan att räkna med koden. Dessutom är ingen skyddad från merge-konflikter när det finns så många ändrade filer. Här bör det noteras att i CI-processen sker versionsändringar automatiskt tillsammans med förändringen av funktionalitet, och inte på något separat sätt.

Nya funktioner

Under en tid lugnade vi oss och, accepterande, levde vi så här tills killarna från Maven Apache Project började i maven från version 3.5.0-beta-1 att stödja så kallade "versionsersättare" (placeholders). Idén med dessa ersättare är att pom.xml snarare än ett konkret versionsangivande används variabler. ${revision}, ${sha1} och ${changelist}. Själva värdena för dessa egenskaper anges antingen i elementet <properties>, eller så kan de definieras genom systemegenskapen

mvn -Drevision=2.0.0 clean package

Värdena för systemegenskaper har företräde framför värden som definieras i <properties>.

Förälder
<project>
  <modelVersion>4.0.0<\/modelVersion>
  <parent>
    <groupId>org.apache<\/groupId>
    <artifactId>apache<\/artifactId>
    <version>18<\/version>
  <\/parent>
  <groupId>org.apache.maven.ci<\/groupId>
  <artifactId>ci-parent<\/artifactId>
  <name>First CI Friendly<\/name>
  <version>${revision}${sha1}${changelist}<\/version>
  …
  <properties>
    <revision>1.3.1<\/revision>
    <changelist>-SNAPSHOT<\/changelist>
    <sha1\/>
  <\/properties>
<\/project>

Barn
<project>
  <modelVersion>4.0.0<\/modelVersion>
  <parent>
    <groupId>org.apache.maven.ci<\/groupId>
    <artifactId>ci-parent<\/artifactId>
    <version>${revision}${sha1}${changelist}<\/version>
  <\/parent>
  <groupId>org.apache.maven.ci<\/groupId>
  <artifactId>ci-child<\/artifactId>
   …
<\/project>

Om du vill bygga version 2.0.0-SNAPSHOT, så använder du helt enkelt

    mvn -Drevision=2.0.0 clean package

Om du vill göra en release, så nollställer du bara SNAPSHOT

    mvn -Dchangelist= clean package

*Exemplen ovan är tagna från artiklar den officiella webbplatsen för Maven Apache Project

Den hårda verkligheten

Allt är bra och fantastiskt, det är dags att känna tillfredsställelse, men nej. Det visar sig att för install och deploy fungerar inte den här metoden, eftersom i beskrivningarna av artefakterna som publiceras till lagret kommer det inte att bytas ut ${revision} mot dess värde, och maven kommer inte att förstå vad det handlar om.

<parent>
    <groupId>org.apache<\/groupId>
    <artifactId>apache<\/artifactId>
    <version>${revision}<\/version>
<\/parent>

Ljus i slutet av tunneln

Vi måste leta efter en lösning på problemet. Situationen skulle kunna räddas av flatten-maven-plugin. Den här pluginen tillåter alla variabler i pom, men skär också bort en hel del annan information som bara behövs vid byggandet och inte vid import av publicerade artefakter till andra projekt. Dessutom "utjämnar" pluginen alla parent-child beroenden, och resultatet blir platta pom som inkluderar allt som behövs. Nackdelen var att den skär bort för mycket "överflödig" information som inte passade oss alls. Efter att ha studerat informationen om utvecklingen av denna plugin, visade det sig att vi inte var ensamma i universum, och redan i augusti 2018 skapades en pull-request i pluginens GitHub-repositorium med önskemålet att ge möjlighet att själva definiera hur man vill "förstöra" pom.xml. Utvecklarna lyssnade på rösterna hos dem som sökte, och redan i december med lanseringen av den nya versionen 1.1.0 kom ett nytt läge resolveCiFriendliesOnly till flatten-maven-plugin, vilket kom lägligt – det lämnar pom.xml som den är, förutom elementet <version> och tillåter ${revision}, ${sha1} och ${changelist}.

Vi lägger till pluginen i projektet

<plugins>
  <plugin>
    <groupId>org.codehaus.mojo<\/groupId>
    <artifactId>flatten-maven-plugin<\/artifactId>
    <version>1.1.0<\/version>
    <configuration>
      <updatePomFile>true<\/updatePomFile>
      <flattenMode>resolveCiFriendliesOnly<\/flattenMode>
    <\/configuration>
    <executions>
      <execution>
        <id>flatten<\/id>
        <phase>process-resources<\/phase>
        <goals>
          <goal>flatten<\/goal>
        <\/goals>
      <\/execution>
      <execution>
        <id>flatten.clean<\/id>
        <phase>clean<\/phase>
        <goals>
          <goal>clean<\/goal>
        <\/goals>
      <\/execution>
    <\/executions>
  <\/plugin>
<\/plugins>

Klart!

Lyckligt slut

Från och med nu, för att ändra versionen av hela projektet och informera alla beroenden om det, behöver vi bara redigera elementet <revision> i bara en rot pom.xml. Vid granskning kommer det inte en hundra eller två av dessa filer med samma ändring, utan en. Dessutom försvinner behovet av att använda versions-maven-plugin.

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster