Pronalaženje neiskorištenih ovisnosti Gradlea

1. Pregled

Ponekad bismo tijekom razvoja mogli na kraju dodati više ovisnosti nego što koristimo.

U ovom brzom vodiču vidjet ćemo kako pomoću dodatka Gradle Nebula Lint identificirati i riješiti probleme poput ovih.

2. Postavljanje i konfiguracija

U našim primjerima koristimo postavku Gradle 5 s više modula.

Ovaj dodatak radi samo za izradu zasnovanu na Groovyu datoteke.

Konfigurirajmo ga u datoteci za izgradnju korijenskog projekta:

dodaci {id "nebula.lint" verzija "16.9.0"} description = "Korijenski projekt Gradle 5" allprojects {primijeniti dodatak: "java" primijeniti dodatak: "nebula.lint" gradleLint {pravila = ['neiskorištena ovisnost'] } group = "com.baeldung" version = "0.0.1" sourceCompatibility = "1.8" targetCompatibility = "1.8" spremišta {jcenter ()}}

Zasad ga možemo konfigurirati samo na ovaj način za izrade više projekata. To znači da ga ne možemo primijeniti zasebno u svakom modulu.

Dalje, konfigurirajmo ovisnosti naših modula:

description = "Primjer neiskorištenih ovisnosti Gradlea" ovisnosti {implementacija ('com.google.guava: guava: 29.0-jre') testImplementation ('junit: junit: 4.12')}

Dodajmo sada jednostavnu glavnu klasu u naše izvore modula:

javna klasa UnusedDependencies {public static void main (String [] args) {System.out.println ("Hello world"); }}

Na tome ćemo se nadovezati nešto kasnije i vidjeti kako dodatak funkcionira.

3. Scenariji i izvješća o otkrivanju

Dodatak pretražuje izlazne staklenke kako bi otkrio koristi li se ovisnost ili ne.

Međutim, ovisno o nekoliko uvjeta, može nam dati različite rezultate.

U sljedećim ćemo odjeljcima istražiti zanimljivije slučajeve.

3.1. Neiskorištene ovisnosti

Sad kad imamo postavke, pogledajmo osnovni slučaj upotrebe. Zanimaju nas neiskorištene ovisnosti.

Idemo pokrenite lintGradle zadatak:

$ ./gradlew lintGradle> Zadatak: lintGradle FAILED # izlaz neuspjeha izostavljen upozorenje neiskorištena ovisnost ova ovisnost je neiskorištena i može se ukloniti neiskorištena ovisnost / build.gradle: 6 implementacija ('com.google.guava: guava: 29.0-jre' ) Problem 1 problem (0 pogrešaka, 1 upozorenje) Da biste automatski primijenili popravke, pokrenite fixGradleLint, pregledajte i unesite promjene. # još nekih rezultata kvara 

Da vidimo što se dogodilo. Imamo neiskorištenu ovisnost (guava) u našem compileClasspath konfiguracija.

Ako mi trčanje fixGradleLint zadatak kao što dodatak sugerira, ovisnost se automatski uklanja iz našeg graditi.gradle.

Međutim, upotrijebimo umjesto glumačke logike našu ovisnost:

javna statička void glavna (String [] args) {System.out.println ("Hello world"); useGuava (); } private static void useGuava () {Lista popisa = ImmutableList.of ("Baledung", "is", "cool"); System.out.println (list.stream (). Collect (Collectors.joining (""))); }

Ako ga ponovimo, više nećemo imati pogrešaka:

$ ./gradlew lintGradle IZGRADITI USPJEŠNO u 559ms 3 zadaća koja se mogu izvršiti: 1 izvršen, 2 ažurirana

3.2. Korištenje prijelaznih ovisnosti

Sad ćemo uključiti još jednu ovisnost:

ovisnosti {implementacija ('com.google.guava: guava: 29.0-jre') implementacija ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')}

Ovaj put, upotrijebimo nešto iz prijelazne ovisnosti:

javna statička void glavna (String [] args) {System.out.println ("Hello world"); useGuava (); useHttpCore (); } // // ostale metode private static void useHttpCore () {SSLContextBuilder.create (); }

Pogledajmo što će se dogoditi:

$ ./gradlew lintGradle> Zadatak: lintGradle FAILED # izlaz neuspjeha izostavljen upozorenje neiskorištena ovisnost jedna ili više klasa u org.apache.httpcomponents: httpcore: 4.4.13 vaš kôd zahtijeva izravno (nije dostupno automatsko popravljanje) upozorenje neupotrebljeno- ovisnost ova ovisnost je neiskorištena i može se ukloniti neiskorištena-ovisnosti / build.gradle: 8 implementacija ('org.apache.httpcomponents: httpclient: 4.5.12') ✖ 2 problema (0 pogrešaka, 2 upozorenja)

Dobivamo dvije pogreške. Prva pogreška otprilike govori da bismo se trebali pozvati httpcore direktno.

The SSLContextBuilder u našem uzorku je zapravo dio toga.

Druga pogreška kaže da ne koristimo ništa od httpclient.

Ako koristimo prijelaznu ovisnost, dodatak nam govori da to učinimo izravnom.

Zavirimo u naše stablo ovisnosti:

$ ./gradlew neiskorištene ovisnosti: ovisnosti --configuration compileClasspath> Zadatak: neiskorištene ovisnosti: ovisnosti ----------------------------- ------------------------------- Projekt: neiskorištene ovisnosti - Primjer neiskorištenih ovisnosti Gradle --------- -------------------------------------------------- - compileClasspath - Sastaviti put klase za izvorni set 'main'. + --- com.google.guava: guava: 29.0-jre | + --- com.google.guava: neuspješan pristup: 1.0.1 | + --- com.google.guava: listenablefuture: 9999.0-empty-to-izbjeći-sukob-s-guava | + --- com.google.code.findbugs: jsr305: 3.0.2 | + --- org.checkerframework: provjera-kvaliteta: 2.11.1 | + --- com.google.errorprone: error_prone_annotations: 2.3.4 | \ --- com.google.j2objc: j2objc-bilješke: 1.3 \ --- org.apache.httpcomponents: httpclient: 4.5.12 + --- org.apache.httpcomponents: httpcore: 4.4.13 + --- commons -dnevnik: commons-logging: 1.2 \ --- commons-codec: commons-codec: 1.11

U ovom slučaju to možemo vidjeti httpcore je doveo httpclient.

3.3. Korištenje ovisnosti s refleksijom

Što kada koristimo refleksiju?

Poboljšajmo svoj primjer malo:

javna statička void glavna (String [] args) {System.out.println ("Hello world"); useGuava (); useHttpCore (); useHttpClientWithReflection (); } // // ostale metode private static void useHttpClientWithReflection () {try {Class httpBuilder = Class.forName ("org.apache.http.impl.client.HttpClientBuilder"); Metoda create = httpBuilder.getMethod ("create", null); create.invoke (httpBuilder, null); } catch (Iznimka e) {e.printStackTrace (); }}

Ponovimo sada zadatak Gradle:

$ ./gradlew lintGradle> Zadatak: lintGradle FAILED # izlaz neuspjeha izostavljen upozorenje neiskorištena ovisnost jedna ili više klasa u org.apache.httpcomponents: httpcore: 4.4.13 vaš kôd zahtijeva izravno (nije dostupno automatsko popravljanje) upozorenje neupotrebljeno- ovisnost ova ovisnost je neiskorištena i može se ukloniti neiskorištena-ovisnosti / build.gradle: implementacija ('org.apache.httpcomponents: httpclient: 4.5.12') ✖ 2 problema (0 pogrešaka, 2 upozorenja) 

Što se dogodilo? Koristili smo HttpClientBuilder od naše ovisnosti (httpclient) ali svejedno je dobio pogreške.

Ako koristimo knjižnicu s refleksijom, dodatak ne otkriva njezinu upotrebu.

Kao rezultat, možemo vidjeti iste dvije pogreške.

Općenito, trebali bismo konfigurirati takve ovisnosti kao runtimeOnly.

3.4. Generiranje izvješća

Za velike projekte, broj pogrešaka vraćenih u terminalu postaje izazovno za rukovanje.

Konfigurirajmo dodatak da nam umjesto toga da izvješće:

allprojects {primijeniti dodatak: "java" primijeniti dodatak: "nebula.lint" gradleLint {pravila = ['neiskorištena ovisnost'] reportFormat = 'tekst'} // ostali detalji izostavljeni}

Idemo pokrenite generiratiGradleLintReport zadatak i provjerite naš izlazni podatak:

$ ./gradlew generirajteGradleLintReport # izlazni zadatak izostavljen $ cat unused-dependencies / build / reports / gradleLint / unused-dependencies.txt CodeNarc Izvještaj - 20. lipnja 2020., 15:25:28 Sažetak: TotalFiles = 1 FilesWithViolations = 1 P1 = 0 P2 = 3 P3 = 0 Datoteka: /home/user/tutorials/gradle-5/unused-dependencies/build.gradle Kršenje: Pravilo = neiskorištena ovisnost P = 2 Linija = null Msg = [jedna ili više klasa u org. apache.httpcomponents: httpcore: 4.4.13 vaš kôd zahtijeva izravno] Kršenje: Pravilo = neiskorištena ovisnost P = 2 redak = 9 poruka = ​​[ova ovisnost je neiskorištena i može se ukloniti] Src = [implementacija ('org.apache .httpcomponents: httpclient: 4.5.12 ')] Kršenje: Pravilo = neiskorištena ovisnost P = 2 redak = 17 poruka = ​​[ova ovisnost je neiskorištena i može se ukloniti] Src = [testImplementation (' junit: junit: 4.12 ')] [CodeNarc (//www.codenarc.org) v0.25.2] 

Sada otkriva neiskorištene ovisnosti o testCompileClasspath konfiguracija.

To je, nažalost, nedosljedno ponašanje dodatka. Kao rezultat, sada dobivamo tri pogreške.

4. Zaključak

U ovom uputstvu vidjeli smo kako pronaći neiskorištene ovisnosti o gradnjama Gradle.

Prvo smo objasnili opću postavku. Nakon toga istražili smo prijavljene pogreške s različitim ovisnostima i njihovu upotrebu.

Napokon smo vidjeli kako generirati tekstualna izvješća.

Kao i obično, cjelovite uzorke koda možemo pronaći na GitHubu.


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