Kihasználatlan fokozatfüggőségek keresése
1. Áttekintés
Néha a fejlesztés során előfordulhat, hogy több függőséget adunk hozzá, mint amennyit használunk.
Ebben a gyors oktatóanyagban megismerkedünk a Gradle Nebula Lint beépülő modul használatával az ilyen problémák azonosításához és megoldásához.
2. Beállítás és konfigurálás
Példáinkban egy több modulos Gradle 5 telepítést használunk.
Ez a bővítmény csak a Groovy-alapú buildnél működik fájlokat.
Konfiguráljuk a root projekt build fájlban:
bővítmények {id "nebula.lint" verzió "16.9.0"} description = "Gradle 5 gyökérprojekt" allprojects {Apply plugin: "java" Apply plugin: "nebula.lint" gradleLint {szabályok = ['unused-dependency'] } group = "com.baeldung" version = "0.0.1" sourceCompatibility = "1.8" targetCompatibility = "1.8" repositories {jcenter ()}}
Egyelőre csak a többprojektes összeállításokhoz konfigurálhatjuk így. Ez azt jelenti, hogy nem alkalmazhatjuk külön-külön az egyes modulokban.
Ezután konfiguráljuk a modulfüggőségeinket:
description = "Gradle Unused Dependencies example" dependencies {implementáció ('com.google.guava: guava: 29.0-jre') testImplementation ('junit: junit: 4.12')}
Most adjunk hozzá egy egyszerű fő osztályt a modul forrásainkhoz:
public class UnusedDependencies {public static void main (String [] args) {System.out.println ("Hello world"); }}
Erre egy kicsit később építünk, és megnézzük, hogyan működik a bővítmény.
3. Észlelési forgatókönyvek és jelentések
A beépülő modul megkeresi a kimeneti tégelyeket, hogy megállapítsa, függőséget használnak-e vagy sem.
Azonban, több feltételtől függően különböző eredményeket adhat nekünk.
Az érdekesebb eseteket a következő szakaszokban tárjuk fel.
3.1. Fel nem használt függőségek
Most, hogy megvan a beállításunk, nézzük meg az alapvető használati esetet. A fel nem használt függőségek érdekelnek.
Nézzük futtassa a lintGradle feladat:
$ ./gradlew lintGradle> Feladat: lintGradle FAILED # hiba kimenet kihagyva figyelmeztetés használaton kívüli függőség ez a függőség kihasználatlan és eltávolítható a fel nem használt függőségek / build.gradle: 6 implementáció ('com.google.guava: guava: 29.0-jre' ) ✖ 1 probléma (0 hiba, 1 figyelmeztetés) A javítások automatikus alkalmazásához futtassa a fixGradleLint alkalmazást, ellenőrizze és hajtsa végre a módosításokat. # még néhány hibakimenet
Nézzük meg mi történt. Használatlan függőségünk van (gujávafa) miénkben compileClasspath konfiguráció.
Ha mi fuss fixGradleLint feladat ahogy a plugin sugallja, a függőség automatikusan eltávolításra kerül épít.gradle.
Használjunk inkább némi logikát a függőségünkkel:
public static void main (String [] args) {System.out.println ("Hello world"); useGuava (); } private static void useGuava () {List list = ImmutableList.of ("Baledung", "is", "klassz"); System.out.println (list.stream (). Gyűjt (Collectors.joining (""))); }
Ha újra futtatjuk, nem kapunk több hibát:
$ ./gradlew lintGradle SIKERES ÉPÍTÉS 559 ms alatt 3 végrehajtható feladat: 1 végrehajtva, 2 naprakész
3.2. Tranzitív függőségek használata
Vegyünk most egy másik függőséget:
függőségek {implementáció ('com.google.guava: guava: 29.0-jre') megvalósítás ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')}
Ezúttal használjunk valamit egy tranzitív függőségből:
public static void main (String [] args) {System.out.println ("Hello world"); useGuava (); useHttpCore (); } // egyéb módszerek private static void useHttpCore () {SSLContextBuilder.create (); }
Nézzük mi történik:
$ ./gradlew lintGradle> Feladat: lintGradle FAILED # hiba kimenet kihagyta a figyelmeztetést kihasználatlan függőségtől egy vagy több osztály az org.apache.httpcomponents-ben: httpcore: 4.4.13 szükséges a kódodhoz közvetlenül (nincs automatikus javítás) figyelmeztetés nem használt- függőség ez a függőség nem használt, és eltávolítható a nem használt-dependencies / build.gradle: 8 implementáció ('org.apache.httpcomponents: httpclient: 4.5.12') ✖ 2 probléma (0 hiba, 2 figyelmeztetés)
Két hibát kapunk. Az első hiba nagyjából azt mondja, hogy hivatkoznunk kell httpcore közvetlenül.
A SSLContextBuilder mintánkban valójában annak része.
A második hiba azt mondja, hogy nem használunk semmit httpclient.
Ha tranzitív függőséget használunk, akkor a plugin azt mondja, hogy tegyük közvetlené.
Vessünk egy pillantást a függőségfánkra:
$ ./gradlew unused-dependencies: dependencies --configuration compileClasspath> Task: unused-dependencies: dependencies ----------------------------- ------------------------------- Projekt: kihasználatlan függőségek - Példa a kihasználatlan függőségek fokozódására --------- -------------------------------------------------- - compileClasspath - A 'main' forráskészlethez tartozó classpath fordítása. + --- com.google.guava: guava: 29.0-jre | + --- com.google.guava: sikertelenség: 1.0.1 | + --- com.google.guava: listenablefuture: 9999.0-empty-to-elkerülhető-konfliktus-guava-val | + --- com.google.code.findbugs: jsr305: 3.0.2 | + --- org.checkerframework: checker-qual: 2.11.1 | + --- com.google.errorprone: error_prone_annotations: 2.3.4 | \ --- com.google.j2objc: j2objc-annotations: 1.3 \ --- org.apache.httpomponents: httpclient: 4.5.12 + --- org.apache.httpcomponents: httpcore: 4.4.13 + --- commons -logging: commons-logging: 1.2 \ --- commons-codec: commons-codec: 1.11
Ebben az esetben ezt láthatjuk httpcore behozza httpclient.
3.3. A függőségek használata a reflexióval
Mi van akkor, ha reflexiót használunk?
Fejlesszük egy kicsit a példánkat:
public static void main (String [] args) {System.out.println ("Hello world"); useGuava (); useHttpCore (); useHttpClientWithReflection (); } // egyéb módszerek private static void useHttpClientWithReflection () {próbálkozzon {Class httpBuilder = Class.forName ("org.apache.http.impl.client.HttpClientBuilder"); Metódus create = httpBuilder.getMethod ("create", null); create.invoke (httpBuilder, null); } catch (e kivétel) {e.printStackTrace (); }}
Futtassuk újra a Gradle feladatot:
$ ./gradlew lintGradle> Feladat: lintGradle FAILED # hiba kimenet kihagyta a figyelmeztetést kihasználatlan függőségtől egy vagy több osztály az org.apache.httpcomponents-ben: httpcore: 4.4.13 szükséges a kódodhoz közvetlenül (nincs automatikus javítás) figyelmeztetés nem használt- függőség ez a függőség nem használt, és eltávolítható a nem használt függőségek / build.gradle: 9 implementáció ('org.apache.httpcomponents: httpclient: 4.5.12') ✖ 2 probléma (0 hiba, 2 figyelmeztetés)
Mi történt? Használtuk HttpClientBuilder függőségünktől (httpclient) de mégis hibákat kapott.
Ha tükröződő könyvtárat használunk, a bővítmény nem érzékeli annak használatát.
Ennek eredményeként ugyanazt a két hibát láthatjuk.
Általában konfigurálnunk kell az olyan függőségeket, mint futásidejűCsak.
3.4. Jelentések generálása
Nagy projektek esetében a terminálban visszaküldött hibák száma nehezen kezelhető.
Konfiguráljuk a beépülő modult úgy, hogy inkább jelentést adjon nekünk:
allprojects {Apply plugin: "java" Apply plugin: "nebula.lint" gradleLint {szabályok = ['unused-dependency'] reportFormat = 'text'} // egyéb részletek kihagyva}
Nézzük futtassa a generálniGradleLintReport feladat és ellenőrizze a build kimenetünket:
$ ./gradlew generateGradleLintReport # feladat kimenete kihagyott $ cat unused-dependencies / build / reports / gradleLint / unused-dependencies.txt CodeNarc jelentés - 2020. június 20., 15:25:28 Összefoglaló: TotalFiles = 1 FilesWithViolations = 1 P1 = 0 P2 = 3 P3 = 0 Fájl: /home/user/tutorials/gradle-5/unused-dependencies/build.gradle Megsértés: Szabály = fel nem használt függőség P = 2 Sor = null Msg = [egy vagy több osztály az org-ban. apache.httpcomponents: httpcore: 4.4.13 szükséges közvetlenül a kódodhoz] Megsértés: Szabály = nem használt-függőség P = 2 sor = 9 Msg = [ez a függőség nem használt és eltávolítható] Src = [implementáció ('org.apache .httpcomponents: httpclient: 4.5.12 ')] Megsértés: Szabály = nem használt függőség P = 2 Sor = 17 Msg = [ez a függőség nem használt és eltávolítható] Src = [testImplementation (' junit: junit: 4.12 ')] [CodeNarc (//www.codenarc.org) v0.25.2]
Most észleli a nem használt függőségeket a testCompileClasspath konfiguráció.
Ez sajnos a plugin következetlen viselkedése. Ennek eredményeként most három hibát kapunk.
4. Következtetés
Ebben az oktatóanyagban láthattuk, hogyan lehet megtalálni a Gradle buildek fel nem használt függőségeit.
Először ismertettük az általános beállítást. Ezt követően feltártuk a különböző függőségekkel bejelentett hibákat és azok használatát.
Végül láttuk, hogyan lehet szöveges jelentéseket készíteni.
Szokás szerint a teljes kódmintákat megtalálhatjuk a GitHubon.