Finne ubrukt gradeleavhengighet

1. Oversikt

Noen ganger under utviklingen kan vi ende opp med å legge til flere avhengigheter enn vi bruker.

I denne raske opplæringen skal vi se hvordan du bruker Gradle Nebula Lint-plugin for å identifisere og fikse problemer som disse.

2. Oppsett og konfigurasjon

Vi bruker et multi-modul Gradle 5-oppsett i eksemplene våre.

Dette pluginet fungerer bare for Groovy-basert build filer.

La oss konfigurere det i rotprosjektbygningsfilen:

plugins {id "nebula.lint" version "16.9.0"} description = "Gradle 5 root project" allprojects {gjelder plugin: "java" gjelder plugin: "nebula.lint" gradleLint {rules = ['unused-dependency'] } group = "com.baeldung" version = "0.0.1" sourceCompatibility = "1.8" targetCompatibility = "1.8" repositories {jcenter ()}}

Vi kan bare konfigurere det på denne måten for flerprosjektbygginger foreløpig. Dette betyr at vi ikke kan bruke den separat i hver modul.

Deretter la oss konfigurere modulavhengighetene våre:

beskrivelse = "Eksempel på graderte ubrukte avhengigheter" avhengigheter {implementering ('com.google.guava: guava: 29.0-jre') testImplementation ('junit: junit: 4.12')}

La oss nå legge til en enkel hovedklasse i modulkildene våre:

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

Vi vil bygge videre på dette litt senere og se hvordan pluginet fungerer.

3. Oppdagelsesscenarier og rapporter

Pluginen søker i utgangsglassene for å oppdage om en avhengighet brukes eller ikke.

Derimot, avhengig av flere forhold, kan det gi oss forskjellige resultater.

Vi vil utforske de mer interessante sakene i de neste avsnittene.

3.1. Ubrukt avhengighet

Nå som vi har oppsettet, la oss se den grunnleggende brukssaken. Vi er interessert i ubrukte avhengigheter.

La oss kjør lintGradle oppgave:

$ ./gradlew lintGradle> Oppgave: lintGradle FAILED # feilutgang utelatt advarsel ubrukt-avhengighet denne avhengigheten er ubrukt og kan fjernes ubrukt-avhengigheter / build.gradle: 6 implementering ('com.google.guava: guava: 29.0-jre' ) ✖ 1 problem (0 feil, 1 advarsel) Hvis du vil bruke reparasjoner automatisk, kjører du fixGradleLint, gjennomgår og foretar endringene. # litt mer feilutgang 

La oss se hva som skjedde. Vi har en ubrukt avhengighet (guava) i vår compileClasspath konfigurasjon.

Hvis vi løpe fixGradleLint oppgave som plugin-programmet antyder, avhengigheten fjernes automatisk fra vår build.gradle.

La oss imidlertid bruke litt dummy-logikk med vår avhengighet i stedet:

public static void main (String [] args) {System.out.println ("Hello world"); useGuava (); } privat statisk ugyldig brukGuava () {List list = ImmutableList.of ("Baledung", "is", "cool"); System.out.println (list.stream (). Samle (Collectors.joining (""))); }

Hvis vi kjører det på nytt, får vi ikke flere feil:

$ ./gradlew lintGradle BUILD SUCCESSFUL in 559ms 3 handlingsoppgaver: 1 utført, 2 oppdatert

3.2. Bruke transitive avhengigheter

La oss nå inkludere en annen avhengighet:

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

Denne gangen, la oss bruke noe fra en overgangsavhengighet:

public static void main (String [] args) {System.out.println ("Hello world"); useGuava (); useHttpCore (); } // andre metoder privat statisk ugyldig brukHttpCore () {SSLContextBuilder.create (); }

La oss se hva som skjer:

$ ./gradlew lintGradle> Oppgave: lintGradle FAILED # feilutgang utelatt advarsel ubenyttet avhengighet en eller flere klasser i org.apache.httpkomponenter: httpcore: 4.4.13 kreves direkte av koden din (ingen auto-fix tilgjengelig) advarsel ubrukt- avhengighet denne avhengigheten er ubrukt og kan fjernes ubrukt-avhengigheter / build.gradle: 8 implementering ('org.apache.httpcomponents: httpclient: 4.5.12') ✖ 2 problemer (0 feil, 2 advarsler)

Vi får to feil. Den første feilen sier omtrent at vi skal referere httpcore direkte.

De SSLContextBuilder i vårt utvalg er faktisk en del av det.

Den andre feilen sier at vi ikke bruker noe fra httpclient.

Hvis vi bruker en transitiv avhengighet, forteller pluginet oss å gjøre det direkte.

La oss ta en titt på avhengighetstreet vårt:

$ ./gradlew unused-dependencies: dependencies --configuration compileClasspath> Oppgave: ubrukt-avhengigheter: avhengigheter ----------------------------- ------------------------------- Prosjekt: ubrukte avhengigheter - Eksempel på graderte ubrukte avhengigheter --------- -------------------------------------------------- - compileClasspath - Compile classpath for source set 'main'. + --- com.google.guava: guava: 29.0-jre | + --- com.google.guava: failureaccess: 1.0.1 | + --- com.google.guava: listenablefuture: 9999.0-tom-for-å-unngå-konflikt-med-guava | + --- 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-merknader: 1.3 \ --- org.apache.httpkomponenter: httpclient: 4.5.12 + --- org.apache.httpkomponenter: httpcore: 4.4.13 + --- commons -logging: commons-logging: 1.2 \ --- commons-codec: commons-codec: 1.11

I dette tilfellet kan vi se det httpcore blir hentet inn av httpclient.

3.3. Bruke avhengigheter med refleksjon

Hva med når vi bruker refleksjon?

La oss forbedre eksemplet vårt litt:

public static void main (String [] args) {System.out.println ("Hello world"); useGuava (); useHttpCore (); useHttpClientWithReflection (); } // andre metoder privat statisk tomrom useHttpClientWithReflection () {prøv {Class httpBuilder = Class.forName ("org.apache.http.impl.client.HttpClientBuilder"); Method create = httpBuilder.getMethod ("create", null); create.invoke (httpBuilder, null); } fange (Unntak e) {e.printStackTrace (); }}

La oss kjøre Gradle-oppgaven på nytt:

$ ./gradlew lintGradle> Oppgave: lintGradle FAILED # feilutgang utelatt advarsel ubenyttet avhengighet en eller flere klasser i org.apache.httpkomponenter: httpcore: 4.4.13 kreves direkte av koden din (ingen auto-fix tilgjengelig) advarsel ubrukt- avhengighet denne avhengigheten er ubrukt og kan fjernes ubrukt-avhengigheter / build.gradle: 9 implementering ('org.apache.httpcomponents: httpclient: 4.5.12') ✖ 2 problemer (0 feil, 2 advarsler) 

Hva skjedde? Vi brukte HttpClientBuilder fra vår avhengighet (httpclient) men fikk fortsatt feil.

Hvis vi bruker et bibliotek med refleksjon, oppdager ikke programtillegget dets bruk.

Som et resultat kan vi se de samme to feilene.

Generelt sett bør vi konfigurere slike avhengigheter som kjøretid bare.

3.4. Genererer rapporter

For store prosjekter blir antall feil som returneres i en terminal utfordrende å håndtere.

La oss konfigurere pluginet for å gi oss en rapport i stedet:

allprojects {gjelder plugin: "java" bruke plugin: "nebula.lint" gradleLint {rules = ['unused-dependency'] reportFormat = 'text'} // andre detaljer utelatt}

La oss kjør generereGradleLintReport oppgave og sjekk byggutbyttet vårt:

$ ./gradlew generereGradleLintReport # oppgaveutdata utelatt $ cat unused-dependencies / build / reports / gradleLint / unused-dependencies.txt CodeNarc Report - 20. juni 2020, 15:25:28 PM Sammendrag: TotalFiles = 1 FilesWithViolations = 1 P1 = 0 P2 = 3 P3 = 0 Fil: /home/user/tutorials/gradle-5/unused-dependencies/build.gradle Brudd: Regel = ubrukt avhengighet P = 2 Linje = null Msg = [en eller flere klasser i organisasjon. apache.httpkomponenter: httpcore: 4.4.13 kreves av koden din direkte] Brudd: Regel = ubrukt avhengighet P = 2 Linje = 9 Msg = [denne avhengigheten er ubrukt og kan fjernes] Src = [implementering ('org.apache) .httpkomponenter: httpclient: 4.5.12 ')] Brudd: Regel = ubrukt avhengighet P = 2 Linje = 17 Msg = [denne avhengigheten er ubrukt og kan fjernes] Src = [testImplementation (' junit: junit: 4.12 ')] [CodeNarc (//www.codenarc.org) v0.25.2] 

Nå oppdager den ubrukte avhengigheter av testCompileClasspath konfigurasjon.

Dette er dessverre en inkonsekvent oppførsel av pluginet. Som et resultat får vi nå tre feil.

4. Konklusjon

I denne opplæringen så vi hvordan du finner ubrukte avhengigheter av Gradle-bygninger.

Først forklarte vi det generelle oppsettet. Etter det undersøkte vi rapporterte feil med forskjellige avhengigheter og deres bruk.

Til slutt så vi hvordan vi skulle generere tekstbaserte rapporter.

Som vanlig kan vi finne de komplette kodeeksemplene på GitHub.


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