Finde ubrugte gradafhængigheder

1. Oversigt

Nogle gange under udviklingen kan vi ende med at tilføje flere afhængigheder, end vi bruger.

I denne hurtige vejledning skal vi se, hvordan man bruger Gradle Nebula Lint plugin til at identificere og rette problemer som disse.

2. Opsætning og konfiguration

Vi bruger en multi-modul Gradle 5-opsætning i vores eksempler.

Dette plugin fungerer kun til Groovy-baseret build filer.

Lad os konfigurere det i rodprojektets byggefil:

plugins {id "nebula.lint" version "16.9.0"} description = "Gradle 5 rodprojekt" allprojects {anvend plugin: "java" anvend plugin: "nebula.lint" gradleLint {regler = ['ubrugt afhængighed'] } group = "com.baeldung" version = "0.0.1" sourceCompatibility = "1.8" targetCompatibility = "1.8" repositories {jcenter ()}}

Vi kan kun konfigurere det på denne måde til multi-projekt builds indtil videre. Dette betyder, at vi ikke kan anvende det separat i hvert modul.

Lad os derefter konfigurere vores modulafhængigheder:

beskrivelse = "Eksempel på graduerede ubrugte afhængigheder" afhængigheder {implementering ('com.google.guava: guava: 29.0-jre') testImplementation ('junit: junit: 4.12')}

Lad os nu tilføje en simpel hovedklasse i vores modulkilder:

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

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

3. Registreringsscenarier og rapporter

Pluginet søger i outputglasene for at opdage, om en afhængighed bruges eller ej.

Imidlertid, afhængigt af flere forhold kan det give os forskellige resultater.

Vi vil undersøge de mere interessante sager i de næste sektioner.

3.1. Ubrugte afhængigheder

Nu hvor vi har vores opsætning, lad os se den grundlæggende brugssag. Vi er interesserede i ubrugte afhængigheder.

Lad os køre fnugGradle opgave:

$ ./gradlew lintGradle> Opgave: lintGradle FAILED # fejl output udeladt advarsel ubrugt afhængighed denne afhængighed er ubrugt og kan fjernes ubrugte afhængigheder / build.gradle: 6 implementering ('com.google.guava: guava: 29.0-jre' ) ✖ 1 problem (0 fejl, 1 advarsel) Hvis du vil anvende rettelser automatisk, skal du køre fixGradleLint, gennemgå og foretage ændringerne. # nogle flere fejl output 

Lad os se, hvad der skete. Vi har en ubrugt afhængighed (guava) i vores compileClasspath konfiguration.

Hvis vi løb fixGradleLint opgave som pluginet antyder, afhængigheden fjernes automatisk fra vores build.gradle.

Lad os dog bruge nogle dummy-logik med vores afhængighed i stedet:

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

Hvis vi kører det igen, får vi ikke flere fejl:

$ ./gradlew lintGradle BUILD SUCCESSFUL i 559ms 3 handlingsopgaver: 1 udført, 2 opdateret

3.2. Brug af transitive afhængigheder

Lad os nu inkludere en anden afhængighed:

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

Lad os denne gang bruge noget fra en midlertidig afhængighed:

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

Lad os se, hvad der sker:

$ ./gradlew lintGradle> Opgave: lintGradle FAILED # fejloutput udeladt advarsel ubrugt afhængighed en eller flere klasser i org.apache.httpkomponenter: httpcore: 4.4.13 kræves direkte af din kode (ingen automatisk fix tilgængelig) advarsel ubrugt- afhængighed denne afhængighed er ubrugt og kan fjernes ubrugt afhængigheder / build.gradle: 8 implementering ('org.apache.httpcomponents: httpclient: 4.5.12') problems 2 problemer (0 fejl, 2 advarsler)

Vi får to fejl. Den første fejl siger groft, at vi skal henvise httpcore direkte.

Det SSLContextBuilder i vores prøve er faktisk en del af det.

Den anden fejl siger, at vi ikke bruger noget fra httpclient.

Hvis vi bruger en forbigående afhængighed, fortæller pluginet os at gøre det direkte.

Lad os kigge på vores afhængighedstræ:

$ ./gradlew ubrugte afhængigheder: afhængigheder - konfiguration compileClasspath> Opgave: ubrugte afhængigheder: afhængigheder ----------------------------- ------------------------------- Projekt: ubrugte afhængigheder - Eksempel på graduerede ubrugte afhængigheder --------- -------------------------------------------------- - 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 at undgå 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-annotationer: 1.3 \ --- org.apache.httpcomponents: httpclient: 4.5.12 + --- org.apache.httpcomponents: httpcore: 4.4.13 + --- commons -logging: commons-logging: 1.2 \ --- commons-codec: commons-codec: 1.11

I dette tilfælde kan vi se det httpcore er bragt ind af httpclient.

3.3. Brug af afhængigheder med refleksion

Hvad med når vi bruger refleksion?

Lad os forbedre vores eksempel lidt:

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

Lad os køre Gradle-opgaven igen:

$ ./gradlew lintGradle> Opgave: lintGradle FAILED # fejloutput udeladt advarsel ubrugt afhængighed en eller flere klasser i org.apache.httpkomponenter: httpcore: 4.4.13 kræves direkte af din kode (ingen automatisk fix tilgængelig) advarsel ubrugt- afhængighed denne afhængighed er ubrugt og kan fjernes ubrugt afhængigheder / build.gradle: 9 implementering ('org.apache.httpcomponents: httpclient: 4.5.12') problems 2 problemer (0 fejl, 2 advarsler) 

Hvad skete der? Vi brugte HttpClientBuilder fra vores afhængighed (httpclient) men fik stadig fejl.

Hvis vi bruger et bibliotek med refleksion, registrerer pluginet ikke dets anvendelse.

Som et resultat kan vi se de samme to fejl.

Generelt skal vi konfigurere sådanne afhængigheder som runtimeKun.

3.4. Genererer rapporter

For store projekter bliver antallet af fejl, der returneres i en terminal, udfordrende at håndtere.

Lad os konfigurere pluginet til at give os en rapport i stedet:

allprojects {anvend plugin: "java" anvend plugin: "nebula.lint" gradleLint {regler = ['ubrugt-afhængighed'] reportFormat = 'tekst'} // andre detaljer udeladt}

Lad os køre generereGradleLintReport opgave og tjek vores build output:

$ ./gradlew generereGradleLintReport # opgaveoutput udeladt $ cat ubrugt-afhængigheder / build / rapporter / gradleLint / ubrugt-afhængigheder.txt CodeNarc-rapport - 20. juni 2020, 15:25:28 PM Oversigt: TotalFiles = 1 FilesWithViolations = 1 P1 = 0 P2 = 3 P3 = 0 Fil: /home/user/tutorials/gradle-5/unused-dependencies/build.gradle Brud: Regel = ubrugt afhængighed P = 2 Linje = null Msg = [en eller flere klasser i organisation. apache.httpkomponenter: httpcore: 4.4.13 kræves direkte af din kode] Overtrædelse: Regel = ubrugt afhængighed P = 2 Linje = 9 Msg = [denne afhængighed er ubrugt og kan fjernes] Src = [implementering ('org.apache) .httpkomponenter: httpclient: 4.5.12 ')] Overtrædelse: Regel = ubrugt afhængighed P = 2 Linje = 17 Msg = [denne afhængighed er ubrugt og kan fjernes] Src = [testImplementation (' junit: junit: 4.12 ')] [CodeNarc (//www.codenarc.org) v0.25.2] 

Nu registrerer den ubrugte afhængighed af testCompileClasspath konfiguration.

Dette er desværre en inkonsekvent opførsel af pluginet. Som et resultat får vi nu tre fejl.

4. Konklusion

I denne vejledning så vi, hvordan man finder ubrugte afhængigheder af Gradle builds.

Først forklarede vi den generelle opsætning. Derefter undersøgte vi de rapporterede fejl med forskellige afhængigheder og deres anvendelse.

Endelig så vi, hvordan man genererer tekstbaserede rapporter.

Som sædvanligt kan vi finde de komplette kodeeksempler på GitHub.


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