Porovnanie verzií v Jave

1. Prehľad

S pokrokom v technológiách DevOps je bežné vytvárať a nasadzovať aplikácie viackrát za deň.

Preto každému zostaveniu je priradené jedinečné číslo verzie, aby sme mohli rozlišovať medzi zostaveniami. Niekedy vzniká potreba programového porovnania reťazcov verzie.

V tomto článku preskúmame niekoľko spôsobov, ako porovnať reťazce verzií v Jave prostredníctvom rôznych knižníc. Na záver napíšeme vlastný program na spracovanie všeobecného porovnania verzií a reťazcov.

2. Pomocou maven-artefakt

Na začiatok sa pozrime, ako Maven spracováva porovnanie verzií.

2.1. Maven závislosť

Najskôr pridáme najnovšie maven-artefakt Zlá závislosť na našej pom.xml:

 org.apache.maven maven-artefakt 3.6.3 

2.2. ComparableVersion

Poďme preskúmať ComparableVersion trieda. Poskytuje a generická implementácia porovnania verzií s neobmedzeným počtom komponentov verzie.

Obsahuje a porovnať s metóda a výsledok porovnania bude väčší alebo menší ako 0, ak je jedna verzia väčšia alebo menšia ako druhá:

ComparableVersion version1_1 = nový ComparableVersion ("1.1"); ComparableVersion version1_2 = new ComparableVersion ("1.2"); ComparableVersion version1_3 = new ComparableVersion ("1.3"); assertTrue (verzia1_1.compareTo (verzia1_2) 0);

Tu môžeme potvrdiť, že verzia 1.1 je menšia ako verzia 1.2 a verzia 1.3 je väčšia ako verzia 1.2.

Výsledkom však bude 0, keď porovnáme rovnaké verzie:

ComparableVersion version1_1_0 = nový ComparableVersion ("1.1.0"); assertEquals (0, version1_1.compareTo (verzia1_1_0));

2.3. Oddeľovače verzií a kvalifikátory

Okrem toho ComparableVersion trieda rešpektuje bodku (.) a spojovník (-) ako oddeľovače, kde bodka oddeľuje hlavné a vedľajšie verzie a spojovník definuje kvalifikátory:

ComparableVersion version1_1_alpha = nový ComparableVersion („1.1-alfa“); assertTrue (verzia1_1.compareTo (verzia1_1_alpha)> 0);

Tu môžeme potvrdiť, že verzia 1.1 je väčšia ako verzia 1.1-alfa.

Existuje niekoľko známych kvalifikácií podporovaných ComparableVersion ako alfa, beta, míľnik, RCa momentka (v poradí od najnižšej po najvyššiu):

ComparableVersion version1_1_beta = nový ComparableVersion („1.1-beta“); ComparableVersion version1_1_milestone = nový ComparableVersion („1,1-míľnik“); ComparableVersion version1_1_rc = nový ComparableVersion ("1.1-rc"); ComparableVersion version1_1_snapshot = nový ComparableVersion („1,1-snímka“); assertTrue (verzia1_1_alpha.compareTo (verzia1_1_beta) <0); assertTrue (verzia1_1_beta.compareTo (verzia1_1_milestone) <0); assertTrue (verzia1_1_rc.compareTo (verzia1_1_snapshot) <0); assertTrue (verzia1_1_snapshot.compareTo (verzia1_1) <0);

Tiež to umožňuje nám definovať neznáme kvalifikátory a rešpektuje ich poradie po už diskutovaných známych kvalifikátoroch s lexikálnym poradím nerozlišujúcim veľké a malé písmená:

ComparableVersion version1_1_c = nový ComparableVersion ("1.1-c"); ComparableVersion version1_1_z = nový ComparableVersion ("1.1-z"); ComparableVersion version1_1_1 = nový ComparableVersion ("1.1.1"); assertTrue (verzia1_1_c.compareTo (verzia1_1_z) <0); assertTrue (verzia1_1_z.compareTo (verzia1_1_1) <0);

3. Používanie gradle-core

Rovnako ako Maven, aj Gradle má zabudovanú schopnosť spracovávať porovnanie verzií.

3.1. Maven závislosť

Najskôr pridajme najnovšie gradle-core Závislosť Maven z repozitára Gradle Releases:

 org.gradle gradle-core 6.1.1 

3.2. Číslo verzie

The Číslo verzie trieda, ktorú poskytuje Gradle, porovnáva dve verzie podobné Mavenovej ComparableVersion trieda:

VersionNumber version1_1 = VersionNumber.parse ("1.1"); VersionNumber version1_2 = VersionNumber.parse ("1.2"); VersionNumber version1_3 = VersionNumber.parse ("1.3"); assertTrue (verzia1_1.compareTo (verzia1_2) 0); VersionNumber version1_1_0 = VersionNumber.parse ("1.1.0"); assertEquals (0, version1_1.compareTo (verzia1_1_0)); 

3.3. Komponenty verzie

Na rozdiel od ComparableVersion triedy, Číslo verzie trieda podporuje iba päť komponentov verzie - Major, Menšie, Micro, Nášivkaa Kvalifikátor:

VersionNumber version1_1_1_1_alpha = VersionNumber.parse ("1.1.1.1-alpha"); assertTrue (version1_1.compareTo (version1_1_1_1_alpha) <0); VersionNumber version1_1_beta = VersionNumber.parse ("1.1.0.0-beta"); assertTrue (verzia1_1_beta.compareTo (verzia1_1_1_1_alpha) <0);

3.4. Schémy verzií

Tiež Číslo verzie podporuje niekoľko rôznych verzií schém ako Major. Menší. Mikrokvalifikátor a Major.Minor.Micro.Patch-Qualifier:

VersionNumber version1_1_1_snapshot = VersionNumber.parse ("1.1.1-snapshot"); assertTrue (verzia1_1_1_1_alpha.compareTo (verzia1_1_1_snapshot) <0);

4. Používanie jackson-core

4.1. Maven závislosť

Podobne ako v iných závislostiach, pridajme najnovšie jackson-core Zlá závislosť na našej pom.xml:

 com.fasterxml.jackson.core jackson-core 2.11.1 

4.2. Verzia

Potom môžeme preskúmať Jacksona Verzia triedy, ktorá môže obsahovať informácie o verziách komponentu spolu s voliteľným groupId a artifactId hodnoty.

Preto konštruktér Verzia trieda nám umožňuje definovať groupId a artifactId, spolu s komponentmi ako Major, Menšiea Nášivka:

verejná verzia (int major, int minor, int patchLevel, String snapshotInfo, String groupId, String artifactId) {// ...}

Poďme si teda porovnať niekoľko verzií pomocou Verzia trieda:

Verzia version1_1 = nová verzia (1, 1, 0, null, null, null); Verzia version1_2 = nová verzia (1, 2, 0, null, null, null); Verzia version1_3 = nová verzia (1, 3, 0, null, null, null); assertTrue (verzia1_1.compareTo (verzia1_2) 0); Verzia version1_1_1 = nová verzia (1, 1, 1, null, null, null); assertTrue (verzia1_1.compareTo (verzia1_1_1) <0);

4.3. The snapshotInfo Komponent

The snapshotInfo komponent sa nepoužíva pri porovnaní dvoch verzií:

Verzia version1_1_snapshot = nová verzia (1, 1, 0, „snapshot“, null, null); assertEquals (0, version1_1.compareTo (verzia1_1_snapshot));

Okrem toho Verzia trieda poskytuje isSnapshot metóda na kontrolu, či verzia obsahuje súčasť snímky:

assertTrue (version1_1_snapshot.isSnapshot ());

4.4. The groupId a artifactId Komponenty

Táto trieda tiež porovnáva lexikálne poradie groupId a artifactId komponenty verzie:

Verzia version1_1_maven = nová verzia (1, 1, 0, null, "org.apache.maven", null); Verzia version1_1_gradle = nová verzia (1, 1, 0, null, "org.gradle", null); assertTrue (verzia1_1_maven.compareTo (verzia1_1_gradle) <0);

5. Používanie Semver4J

The Semver4j Knižnica nám umožňuje dodržiavať pravidlá špecifikácie sémantického verzovania v prostredí Java.

5.1. Maven závislosť

Najskôr pridáme najnovšie semver4j Závislosť Maven:

 com.vdurmont semver4j 3.1.0 

5.2. Semver

Potom môžeme použiť Semver triedy na definovanie verzie:

Semver version1_1 = nový Semver ("1.1.0"); Semver version1_2 = nový Semver ("1.2.0"); Semver version1_3 = nový Semver ("1.3.0"); assertTrue (verzia1_1.compareTo (verzia1_2) 0); 

Interne analyzuje verziu na komponenty ako Major, Menšiea Nášivka.

5.3. Porovnanie verzií

Tiež Semver trieda prichádza s rôznymi vstavanými metódami ako je väčší ako, isLowerThana rovná sa pre porovnanie verzií:

Semver version1_1_alpha = nový Semver ("1.1.0-alfa"); assertTrue (verzia1_1.isGreaterThan (verzia1_1_alpha)); Semver verzia1_1_beta = nový Semver ("1.1.0-beta"); assertTrue (verzia1_1_alpha.isLowerThan (verzia1_1_beta)); assertTrue (version1_1.isEqualTo ("1.1.0"));

Rovnako poskytuje: rozdiel metóda, ktorá vráti hlavný rozdiel medzi týmito dvoma verziami:

assertEquals (VersionDiff.MAJOR, version1_1.diff ("2.1.0")); assertEquals (VersionDiff.MINOR, version1_1.diff ("1.2.3")); assertEquals (VersionDiff.PATCH, version1_1.diff ("1.1.1"));

5.4. Stabilita verzie

Tiež Semver trieda prichádza s je stabilný metóda na kontrolu stability verzie, určená prítomnosťou alebo neprítomnosťou prípony:

assertTrue (version1_1.isStable ()); assertFalse (version1_1_alpha.isStable ());

6. Zákazkové riešenie

Videli sme niekoľko riešení na porovnanie reťazcov verzie. Ak nefungujú pre konkrétny prípad použitia, možno budeme musieť napísať vlastné riešenie.

Tu je jednoduchý príklad, ktorý funguje pre niektoré základné prípady - ak je potrebné niečo viac, je možné ho kedykoľvek predĺžiť.

Myšlienkou je tokenizovať reťazce verzie pomocou oddeľovača bodiek a potom porovnať celočíselný prevod každého z nich String žetón, začínajúci zľava. Ak je celočíselná hodnota tokenu rovnaká, preskúmajte nasledujúci token a pokračujte v tomto kroku, kým nenájdeme rozdiel (alebo kým nedosiahneme posledný token v ktoromkoľvek reťazci):

public static int compareVersions (reťazec verzia1, reťazec verzia2) {int comparisonResult = 0; Reťazec [] version1Splits = version1.split ("\."); Reťazec [] version2Splits = version2.split ("\."); int maxLengthOfVersionSplits = Math.max (verzia1Splits.length, version2Splits.length); pre (int i = 0; i <maxLengthOfVersionSplits; i ++) {Integer v1 = i <version1Splits.length? Integer.parseInt (version1Splits [i]): 0; Celé číslo v2 = i <version2Splits.length? Integer.parseInt (version2Splits [i]): 0; int porovnaj = v1.compareTo (v2); if (porovnaj! = 0) {comparisonResult = porovnaj; prestávka; }} return comparisonResult; }

Poďme si naše riešenie overiť porovnaním niekoľkých verzií:

assertTrue (VersionCompare.compareVersions ("1.0.1", "1.1.2") <0); assertTrue (VersionCompare.compareVersions ("1.0.1", "1.10") 0); assertTrue (VersionCompare.compareVersions ("1.1.2", "1.2.0") <0); assertEquals (0, VersionCompare.compareVersions ("1.3.0", "1.3"));

Tento kód má obmedzenie, že môže porovnávať iba číslo verzie z celých čísel ohraničených bodkami.

Preto na porovnanie reťazcov alfanumerických verzií môžeme použiť regulárny výraz na oddelenie abecedy a porovnanie lexikálneho poradia.

7. Záver

V tomto článku sme sa zaoberali rôznymi spôsobmi porovnania reťazcov verzií v Jave.

Spočiatku sme skúmali vstavané riešenia poskytované rámcami zostáv ako Maven a Gradle pomocou nástroja maven-artefakt a gradle-core závislosti, resp. Potom sme preskúmali funkcie porovnávania verzií jackson-core a semver4j knižnice.

Nakoniec sme napísali vlastné riešenie na porovnanie reťazcov generických verzií.

Ako obvykle sú všetky implementácie kódu dostupné na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found