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.