Kogemus flatten-maven-plugin'i kasutamisest Maven-projektide versiooni lihtsustamiseks

Meist

1C-s me loobime mitte ainult platvormi 1C: Ettevõte . Tundub, et C++ ja JavaScript, vaid ka rakendusi Java-s – nimelt uut arenduskeskkonda Enterprise Development Tools Eclipse'i põhjal ja server, mis on sügavalt integreeritud sõnumirakendusega – Koostöö süsteemid.

Sissejuhatus

Java rakenduste koostamise süsteemina kasutame kõige sagedamini mavenit ja selles lühikeses artiklis soovime rääkida ühest probleemist, millega oleme arenduse korraldamisel silmitsi seisnud, ning lähenemisest, mis selle probleemi lahendamiseks aitas.

Eeltingimused ja tööprotsess

Kuna meie maven-projektide arendamise iseloom nõuab meilt palju mooduleid, sõltuvusi ja alprojektide kasutamist, võib ühe puu pom-failide arv ulatuda kümnete ja isegi sadade kaupa.

Kogemus flatten-maven-plugin'i kasutamisest Maven-projektide versiooni lihtsustamiseks

Tundub, et pole hullu, loodud üks kord ja unustatud. Kui tuleb midagi kõigis failides korrigeerida või lisada, on redigeerijates ja IDE-des palju mugavaid tööriistu. Aga mis on kõige levinum regulaarne muudatus pom.xml-is? Usume, et projektide ja sõltuvuste versioonide muutmine. Võib-olla keegi tahaks selle üle vaielda, aga meil on asi just nii. Põhjus peitub selles, et koos tuumaga arendame samal ajal palju oma teeke ja tulemuste pidev reprodutseeritavus kogumises ja testimises ei võimalda meil kasutada sniemikeid. Seetõttu peame iga koostamise ajal projektides versiooninumbrit tõstma.

Samuti tekib arendajal aeg-ajalt vajadus koguda oma haru mõnest raamatukogust ja kontrollida selle toimivust kõigi sõltuvuste osas, millega on vajalik manuaalselt muuta versioon kõigis neist.

Esialgne lahendus

Selliste sagedaste ja mitmekesiste versioonimuudatustega tahame CI käigus protsessi lihtsustada ja automatiseerida. Siin tuleb appi mugav ja tuntud plugin versions-maven-plugin — kutsume selle üles ja käivitame

mvn -N versions:set -DnewVersion=2.0.1

ja maven teeb kõik nagu peab: jookseb puu ülevalt alla, asendab kõik versioonid — ilus! Nüüd peab lihtsalt pull-requesti tõstma, kolleegid vaatavad muudatused üle ja saab kiiresti trunk'i voolata. Kiiresti? Kuidas siis niimoodi. Paar-kolm sada pom.xml ülevaatusel, ja see ei hõlma koodi. Lisaks ei ole merge-konfliktide eest keegi kaitstud nii paljude muutunud failide puhul. Siin tuleb märkida, et CI protsessis toimuvad versioonimuutused automaatselt koos funktsionaalsuse muutumisega, mitte kuidagi eraldi.

Uued võimalused

Mõneks ajaks rahunesime ja leppisime sellega, et elasime edasi, kuni poisid Maven Apache Project kaasas mavenisse alates versioonist 3.5.0-beta-1 toe nii nimetatud "versioonide asendajate" (placeholders) jaoks. Asendajate mõte on selles, et pom.xml konkreetselt näidatud projekti versioonide asemel kasutatakse muutujaid ${revision}, ${sha1} ja ${changelist}. Nende omaduste väärtusi saab määrata kas elemendis <properties>, või saab neid määrata läbi süsteemi omaduse

mvn -Drevision=2.0.0 clean package

Süsteemi omaduste väärtused on eelised väärtustele, mis on määratud <properties>.

Vanem
<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>Esimene CI Sõbralik<\/name>
  <version>${revision}${sha1}${changelist}<\/version>
  …
  <properties>
    <revision>1.3.1<\/revision>
    <changelist>Peab olema olemas<\/changelist>
    <sha1\/>
  <\/properties>
<\/project>

Järeltulija
<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>

Kui soovid luua versiooni 2.0.0-SNAPSHOT, siis kasutame lihtsalt

    mvn -Drevision=2.0.0 clean package

Kui soovid teha väljaande, siis lihtsalt nullime SNAPSHOT

    mvn -Dchangelist= clean package

*Ülaltoodud näited on võetud artikleid Maven Apache Project veebisaidilt

Karm reaalsus

Kõik on hästi ja tore, on aeg tunda rahulolu, kuid ei. Selgub, et installi ja deploy jaoks ei sobi see meetod, kuna publikatsioonide jaoks, mis avaldatakse hoidlas, ei asendata ${revision} selle väärtusega ja maven ei saa edasi aru, millest üldse jutt.

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

Valgus tunneli lõpus

Probleemi lahendust tuleb otsida. Oleks saanud olukorda päästa flatten-maven-plugin. See plugin allows all variables in pom, but also cuts out a lot of other information that is only needed during assembly and is not required when importing published artifacts into other projects. The plugin also "flattens" all parent-child dependencies, resulting in flat poms that include everything needed. The inconvenience was that it cuts out too much "extra" content, which was not acceptable to us. After studying the information on the development of this plugin, it turned out that we are not alone in the universe, and back in August 2018, a pull request was created in the plugin's GitHub repository with the request to make it possible to determine how to "distort" pom.xml by ourselves. The developers listened to the voices of the needy, and already in December, with the release of the new version 1.1.0, a new mode resolveCiFriendliesOnly appeared in flatten-maven-plugin, which fit perfectly – it leaves pom.xml as is, except for the element <version> and allows ${revision}, ${sha1} ja ${changelist}.

Add plugin to project

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

Valmis!

Happy ending

From now on, in order to change the version of the entire project and notify all dependencies about this, we only need to edit the <revision> element in just one root pom.xml. Instead of receiving a hundred or so of these files with the same change, we receive just one. This also eliminates the need to use versions-maven-plugin.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster