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.