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.