Verzió-összehasonlítás Java-ban

1. Áttekintés

A DevOps technológiák fejlődésével általános, hogy egy alkalmazást naponta többször építenek és telepítenek.

Ebből kifolyólag, minden buildhez egyedi verziószám tartozik, így meg tudjuk különböztetni a buildeket. Előfordul, hogy szükség van a verziósztringek programozott összehasonlítására.

Ebben a cikkben néhány módszert tárunk fel a Java verziós karakterláncainak összehasonlítására a különböző könyvtárakban. Végül írunk egy egyedi programot az általános verzió-karakterlánc összehasonlítás kezelésére.

2. Használata maven-műtárgy

Először is vizsgáljuk meg, hogyan kezeli Maven a verzió-összehasonlítást.

2.1. Maven-függőség

Először hozzáadjuk a legfrissebbet maven-műtárgy Maven függőség a mi pom.xml:

 org.apache.maven maven-artefact 3.6.3 

2.2. ComparableVersion

Fedezzük fel a ComparableVersion osztály. Ez biztosítja a a verzió-összehasonlítás általános megvalósítása korlátlan számú verziókomponenssel.

Tartalmazza a összehasonlítani módszerrel, és az összehasonlítás eredménye nagyobb vagy kevesebb lesz 0-nál, ha az egyik verzió nagyobb vagy kevesebb, mint a másik:

ComparableVersion version1_1 = új ComparableVersion ("1.1"); ComparableVersion version1_2 = new ComparableVersion ("1.2"); ComparableVersion version1_3 = new ComparableVersion ("1.3"); assertTrue (version1_1.compareTo (version1_2) 0);

Itt megerősíthetjük, hogy az 1.1-es verzió kisebb, mint az 1.2-es, és az 1.3-as verzió nagyobb, mint az 1.2-es verzió.

Ugyanakkor 0-t kapunk, ha ugyanazokat a verziókat hasonlítjuk össze:

ComparableVersion version1_1_0 = new ComparableVersion ("1.1.0"); assertEquals (0, version1_1.compareTo (version1_1_0));

2.3. Verzióelválasztók és selejtezők

Ezenkívül a ComparableVersion osztály tiszteletben tartja a pontot (.) és a kötőjelet (-) elválasztóként, ahol a a pont elválasztja a fő és a kisebb változatot, és a kötőjel meghatározza a selejtezőket:

ComparableVersion version1_1_alpha = new ComparableVersion ("1.1-alfa"); assertTrue (version1_1.compareTo (version1_1_alpha)> 0);

Itt megerősíthetjük, hogy az 1.1-es verzió nagyobb, mint az 1.1-alfa verzió.

Van néhány jól ismert selejtező, amelyet a ComparableVersion mint a alfa, béta, mérföldkő, RC, és pillanatkép (a legalacsonyabbtól a legnagyobbig):

ComparableVersion version1_1_beta = new ComparableVersion ("1.1-beta"); ComparableVersion version1_1_milestone = new ComparableVersion ("1.1-mérföldkő"); ComparableVersion version1_1_rc = new ComparableVersion ("1.1-rc"); ComparableVersion version1_1_snapshot = new ComparableVersion ("1.1-pillanatkép"); assertTrue (version1_1_alpha.compareTo (version1_1_beta) <0); assertTrue (version1_1_beta.compareTo (version1_1_milestone) <0); assertTrue (version1_1_rc.compareTo (version1_1_snapshot) <0); assertTrue (version1_1_snapshot.compareTo (version1_1) <0);

Azt is lehetővé teszi számunkra az ismeretlen minősítők meghatározását, és tiszteletben tartja azok sorrendjét, a már tárgyalt ismert minősítők után, kis- és nagybetűk nélküli lexikai sorrenddel:

ComparableVersion version1_1_c = new ComparableVersion ("1.1-c"); ComparableVersion version1_1_z = new ComparableVersion ("1.1-z"); ComparableVersion version1_1_1 = új ComparableVersion ("1.1.1"); assertTrue (version1_1_c.compareTo (version1_1_z) <0); assertTrue (version1_1_z.compareTo (version1_1_1) <0);

3. Használata gradle-core

Mavenhez hasonlóan Gradle is rendelkezik beépített képességgel a verzió-összehasonlítás kezelésére.

3.1. Maven-függőség

Először tegyük hozzá a legfrissebbet gradle-core Maven-függőség a Gradle Releases repótól:

 org.gradle gradle-core 6.1.1 

3.2. VersionNumber

A VersionNumber a Gradle által nyújtott osztály két verziót hasonlít össze, hasonlóan a Mavenéhez ComparableVersion osztály:

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

3.3. Verziókomponensek

ellentétben a ComparableVersion osztály, az VersionNumber osztály csak öt verziókomponentot támogat - Jelentősebb, Kiskorú, Micro, Tapasz, és Minősítő:

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

3.4. Verziós sémák

Is, VersionNumber támogat pár különféle verziósémát, mint például Őrnagy, kisebb, mikrokvalifikátor és Major.Minor.Micro.Patch-Qualifier:

VersionNumber version1_1_1_snapshot = VersionNumber.parse ("1.1.1-pillanatkép"); assertTrue (version1_1_1_1_alpha.compareTo (version1_1_1_snapshot) <0);

4. Használata jackson-core

4.1. Maven-függőség

Hasonlóan a többi függőséghez, tegyük hozzá a legfrissebbet jackson-core Maven függőség a mi pom.xml:

 com.fasterxml.jackson.core jackson-core 2.11.1 

4.2. Változat

Ezután megvizsgálhatjuk Jacksonét Változat osztály, amely egy komponens verziószámait tartalmazza az opcionális mellett groupId és artefactId értékek.

Ezért a Változat osztály lehetővé teszi számunkra, hogy meghatározzuk groupId és artifactId, olyan alkatrészekkel együtt, mint Jelentősebb, Kiskorú, és Tapasz:

nyilvános verzió (int major, int minor, int patchLevel, String snapshotInfo, String groupId, String artefactId) {// ...}

Tehát hasonlítsunk össze néhány verziót a Változat osztály:

Version version1_1 = new Version (1, 1, 0, null, null, null); Version1_2 = új verzió (1, 2, 0, null, null, null); Version version1_3 = new Version (1, 3, 0, null, null, null); assertTrue (version1_1.compareTo (version1_2) 0); Version version1_1_1 = new Version (1, 1, 1, null, null, null); assertTrue (version1_1.compareTo (version1_1_1) <0);

4.3. A snapshotInfo Összetevő

A snapshotInfo komponens nem használatos két verzió összehasonlítása közben:

Version version1_1_snapshot = new Version (1, 1, 0, "pillanatkép", null, null); assertEquals (0, version1_1.compareTo (version1_1_snapshot));

Ezenkívül a Változat osztály biztosítja a isSnapshot módszer annak ellenőrzésére, hogy a verzió tartalmaz-e pillanatkép-összetevőt:

assertTrue (version1_1_snapshot.isSnapshot ());

4.4. A groupId és artefactId Alkatrészek

Ez az osztály összehasonlítja a groupId és artefactId verziókomponensek:

Version version1_1_maven = new Version (1, 1, 0, null, "org.apache.maven", null); Version version1_1_gradle = new Version (1, 1, 0, null, "org.gradle", null); assertTrue (version1_1_maven.compareTo (version1_1_gradle) <0);

5. Használata Semver4J

A Semver4j könyvtár lehetővé teszi számunkra, hogy betartsuk a Java szemantikus verziós specifikációjának szabályait.

5.1. Maven-függőség

Először hozzáadjuk a legfrissebbet semver4j Maven-függőség:

 com.vdurmont semver4j 3.1.0 

5.2. Semver

Ezután használhatjuk a Semver osztály egy verzió meghatározásához:

Semver version1_1 = new Semver ("1.1.0"); Semver version1_2 = new Semver ("1.2.0"); Semver version1_3 = new Semver ("1.3.0"); assertTrue (version1_1.compareTo (version1_2) 0); 

Belsőleg elemez egy verziót olyan alkatrészekre, mint a Jelentősebb, Kiskorú, és Tapasz.

5.3. Verzió összehasonlítás

Továbbá a Semver osztály különféle beépített módszerekkel érkezik, mint pl nagyobb, mint, isLowerThan, és egyenlő verzió összehasonlításhoz:

Semver version1_1_alpha = new Semver ("1.1.0-alfa"); assertTrue (version1_1.isGreaterThan (version1_1_alpha)); Semver version1_1_beta = new Semver ("1.1.0-beta"); assertTrue (version1_1_alpha.isLowerThan (version1_1_beta verzió)); assertTrue (version1_1.isEqualTo ("1.1.0"));

Hasonlóképpen biztosítja a diff módszer, amely visszaadja a két változat közötti fő különbséget:

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. Verzióstabilitás

Továbbá a Semver osztály jön a isStable módszer a verzió stabilitásának ellenőrzésére, amelyet az utótag megléte vagy hiánya határoz meg:

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

6. Egyedi megoldás

Láttunk néhány megoldást a verziósztringek összehasonlítására. Ha nem egy adott felhasználási esetnél működnek, akkor lehet, hogy egyéni megoldást kell írnunk.

Itt van egy egyszerű példa, amely néhány alapesetnél működik - mindig meghosszabbítható, ha szükségünk van valamire.

Az ötlet az, hogy a verzió karaktersorozatait ponthatárolóval kódoljuk, majd összehasonlítsuk mindegyik egész számát Húr jelző, balról indul. Ha a token egész értéke megegyezik, vizsgálja meg a következő tokent, folytatva ezt a lépést, amíg nem találunk különbséget (vagy amíg el nem érjük az utolsó tokent mindkét sztringben):

public static int CompareVersions (String version1, String version2) {int CompareResult = 0; Karakterlánc [] version1Splits = version1.split ("\."); Karakterlánc [] version2Splits = version2.split ("\."); int maxLengthOfVersionSplits = Math.max (version1Splits.length, version2Splits.length); for (int i = 0; i <maxLengthOfVersionSplits; i ++) {Egész szám v1 = i <verzió1Splits.length? Integer.parseInt (version1Splits [i]): 0; Egész v2 = i <verzió2Splits.length? Integer.parseInt (version2Splits [i]): 0; int összehasonlít = v1.compareTo (v2); if (összehasonlít! = 0) {összehasonlításEredmény = összehasonlítás; szünet; }} visszatérési összehasonlításEredmény; }

Ellenőrizzük a megoldásunkat néhány verzió összehasonlításával:

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

Ennek a kódnak van egy korlátozása, hogy csak a pontokkal határolt egész számokból készült verziószámot tudja összehasonlítani.

Ezért az alfanumerikus változatsorok összehasonlításához használhatunk szabályos kifejezést az ábécék elkülönítésére és a lexikai sorrend összehasonlítására.

7. Következtetés

Ebben a cikkben különféle módszereket vizsgáltunk a Java-verziók összehasonlítására.

Eleinte a Mavenhez és Gradle-hez hasonló építési keretrendszerek által biztosított beépített megoldásokat vizsgáltuk a maven-műtárgy és gradle-core függőségek, ill. Ezután megvizsgáltuk a jackson-core és semver4j könyvtárak.

Végül írtunk egy egyedi megoldást az általános verzió karaktersorozatok összehasonlítására.

Szokás szerint az összes kód implementáció elérhető a GitHubon.