Cómo encontrar/eliminar dependencias no utilizadas en Gradle

7 minutos de lectura

avatar de usuario
Alexander Bezrodniy

Quería encontrar dependencias no utilizadas en mi proyecto. ¿Hay una función para esto en Gradle, como en Maven?

avatar de usuario
Andante del cielo

ACTUALIZACIÓN para usuarios de Kotlin: 17 de diciembre de 2021: detecta dependencias de compilación faltantes o superfluas en proyectos de Kotlin: versión 1.0.9 (más reciente)

He agregado 2 tipos de configuración para usuarios de Kotlin.

  • Uso de los complementos DSL
  • Uso de la aplicación de complemento heredada

Usando los complementos DSL:

plugins {
  id("com.faire.gradle.analyze") version "1.0.9"
}

Usando la aplicación de complemento heredada:

buildscript {
  repositories {
    maven {
      url = uri("https://plugins.gradle.org/m2/")
    }
  }
  dependencies {
    classpath("com.faire.gradle:gradle-kotlin-buildozer:1.0.9")
  }
}

apply(plugin = "com.faire.gradle.analyze")

Enlace de recursos:

  1. https://plugins.gradle.org/plugin/com.faire.gradle.analyze
  2. https://github.com/Faire/gradle-kotlin-buildozer
  3. https://discuss.gradle.org/t/detecting-unused-projects-dependencies/25522

ACTUALIZACIÓN: 28-06-2016: soporte de Android para dependencia no utilizada

En junio, 2017han lanzado el 4.0.0 version
y renombró el nombre del proyecto raíz "gradle-lint-plugin" a
"nebula-lint-plugin". También han agregado Soporte de Android para dependencia no utilizada.


En mayo 2016 Gradle ha implementado el Complemento de pelusa Gradle para encontrar y eliminar la dependencia no deseada

Complemento Gradle Lint: documentación completa

El complemento Gradle Lint es una herramienta de linter conectable y configurable para identificar e informar sobre patrones de uso indebido o obsolescencia en scripts de Gradle y archivos relacionados.

Este complemento tiene varias reglas. Regla de dependencia no utilizada es uno de ellos. Tiene tres características específicas.

  1. Elimina las dependencias no utilizadas.
  2. Promueve dependencias transitivas que su código usa directamente para explicitar dependencias de primer orden.
  3. Reubica las dependencias a la configuración “correcta”.

Para aplicar la regla, agregue:

gradleLint.rules += 'unused-dependency'

Detalles de Regla de dependencia no utilizada se da en la última parte.

Para aplicar el complemento de pelusa de Gradle:

buildscript { repositories { jcenter() } }
plugins {
  id 'nebula.lint' version '0.30.2'
}

Alternativamente:

buildscript {
  repositories { jcenter() }
  dependencies {
    classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
  }
}

apply plugin: 'nebula.lint'

Defina contra qué reglas le gustaría aplicar pelusa:

gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like

Para una compilación empresarial, recomendamos definir las reglas de pelusa en un script init.gradle o en un script de Gradle que se incluye a través del mecanismo de aplicación de Gradle.

Para proyectos multimódulo, recomendamos aplicar el plugin en un allprojects bloquear:

allprojects {
  apply plugin: 'nebula.lint'
  gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like
}


Detalles de Regla de dependencia no utilizada se da en esta parte

Para aplicar la regla, agregue:

gradleLint.rules += 'unused-dependency'

La regla inspecciona los binarios compilados que emanan de su proyecto conjuntos de fuentes buscando referencias de clase y hace coincidir esas referencias con las dependencias que ha declarado en su dependencias bloquear.

Específicamente, la regla hace los siguientes ajustes a las dependencias:

1. Elimina las dependencias no utilizadas

  • Se eliminan los archivos jar de estilo familiar como com.amazonaws:aws-java-sdk, ya que no contienen ningún código.

2. Promueve dependencias transitivas que su código usa directamente para explicitar dependencias de primer orden

  • Esto tiene el efecto secundario de dividir los archivos JAR de estilo familiar, como com.amazonaws:aws-java-sdk, en las partes que realmente está utilizando y agregarlas como dependencias de primer orden.

3. Reubica las dependencias a la configuración ‘correcta’

  • Los webjar se mueven a la configuración de tiempo de ejecución
  • Archivos JAR que no contienen ninguna clase y el contenido fuera de META-INF se mueve al tiempo de ejecución
  • ‘xerces’, ‘xercesImpl’, ‘xml-apis’ siempre deben tener un alcance de tiempo de ejecución
  • Los proveedores de servicios (archivos JAR que contienen META-INF/servicios) como mysql-connector-java se mueven al tiempo de ejecución si no hay ninguna referencia demostrable en tiempo de compilación
  • Las dependencias se mueven a la configuración de conjunto de origen más alta posible. Por ejemplo, ‘junit’ se reubica en testCompile a menos que exista una dependencia explícita en el conjunto de fuentes principal (raro).


ACTUALIZACIÓN: Complementos anteriores

Para su amable información, quiero compartir sobre complementos anteriores.

  1. El complemento Gradle que encuentra dependencias no utilizadas, declaradas y transitivas es com.github.nullstress.análisis de dependencia

Pero se crea su última versión 1.0.3 23 diciembre 2014. Después de eso no hay ninguna actualización.

NB: Muchos de nuestros ingenieros están confundidos acerca de este complemento ya que actualizaron solo el número de versión, nada más.

  • Lamentablemente, este complemento no funciona con kotlin dsl. No tienen planes para apoyarlo.

    – nieve

    1 de febrero de 2019 a las 18:09

  • Tampoco funciona con las nuevas configuraciones de gradle (por ejemplo: implementation y api), y peor aún, recomienda cambiar de los nuevos a los antiguos en desuso (por ejemplo: compile, testCompileetc.).

    – Laurence Gonsalves

    14 de junio de 2019 a las 5:01

  • @SkyWalker, parece que no has leído mi comentario en absoluto… > Lamentablemente, este complemento no funciona con kotlin dsl. No tienen planes para apoyarlo.

    – nieve

    17 de junio de 2019 a las 3:54

  • Además, no funciona para archivos Gradle basados ​​en Kotlin (agosto de 2020)

    – Christian Vielma

    5 de agosto de 2020 a las 12:55

  • gradle-lint-plugin o nebula-plugin no funciona para el proyecto de Android, (Fuente)[github.com/nebula-plugins/gradle-lint-plugin/issues/…

    – Chetan Gupta

    Jul 14 at 8:42


user avatar
sschrass

I just learned about this one: https://plugins.gradle.org/plugin/com.autonomousapps.dependency-analysis

Github

From the looks it is under active development, but I haven’t tested it yet.

Edit:
Actually its pretty awesome, it provides lots of advises (e.g. whether to use api vs implementation)

  • I would go for this one, I’ve got so much better results, thanks

    – Mohammed Fathy

    Oct 7, 2020 at 12:25

  • Can confirm, this one is excellent, and unlike others also works for kotlin-based gradle files.

    – sigma1510

    Apr 11 at 7:19

The project mentioned in the earlier answers seem to be dead. I use gradle-dependency-analyze. Setup is simple:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'ca.cutterslade.gradle:gradle-dependency-analyze:1.0.3'
  }
}

apply plugin: 'ca.cutterslade.analyze'

Then do:

$ gradle analyzeDependencies

  • I am facing this error: ‘Gradle sync failed: Task with name ‘classes’ not found in project’

    – Pawan

    Dec 5, 2015 at 21:28

  • I get stackOverflowException doing that. No precise information what is causing this though. I think there might be a circular dependency issue here but it would be a great idea I the tool told me where.

    – SGal

    Jun 16, 2016 at 12:41

  • @Pawan this plugin doesn’t work with Android projects, and this isn’t going to change anytime soon. Proof: github.com/wfhartford/gradle-dependency-analyze/issues/18

    – diesersamat

    Jun 19, 2017 at 6:59

user avatar
jstricker

I’ve had a lot of luck using the Gradle Dependency Analysis Plugin. To get started with it, add the following two things to your Gradle build script.

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
    }
}

and

apply plugin: "dependencyAnalysis"

Once those are in place, run gradle analyze. If there are unused dependencies, you’ll get a build failure that shows output similar to the text below, plus a list of the unused dependencies (both declared and transitive). The build failure is really handy if you want to enforce that there should be no unused dependencies via a CI build.

:foo:analyze FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':foo:analyze'.
> The project has unused declared artifacts

user avatar
EFernandes

Editor’s Note: This answer is out of date. Please see the top answer.

You can try the com.github.nullstress.dependency-analysis Gradle plugin

Build script snippet for use in all Gradle versions:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
  }
}

apply plugin: "com.github.nullstress.dependency-analysis"

Build script snippet for new, incubating, plugin mechanism introduced in Gradle 2.1:

plugins {
  id "com.github.nullstress.dependency-analysis" version "1.0.3"
}

Also, there is a thread (Is there a Gradle equivalent of “mvn dependency:analyze”?) in the Gradle forum about this.

  • This plugin seems to be a dead project… at least with the current Gradle version.

    – cjstehno

    Sep 23, 2015 at 19:07

user avatar
Peter Mortensen

The projects on most of the historical answers are dead, but gradle-dependency-analyze appears to be alive as of 2016-05-30.

  • This plugin seems to be a dead project… at least with the current Gradle version.

    – cjstehno

    Sep 23, 2015 at 19:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad