如何在 Gradle 中查找/删除未使用的依赖项

新手上路,请多包涵

我想在我的项目中找到未使用的依赖项。 Gradle 中是否有此功能,就像 Maven 中一样?

原文由 Alexander Bezrodniy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

Kotlin 用户更新:2021 年 12 月 17 日:检测 Kotlin 项目中缺失或多余的构建依赖项:版本 1.0.9(最新)

我为 Kotlin 用户添加了两种类型的配置。

  • 使用插件 DSL
  • 使用遗留插件应用程序

使用插件 DSL:

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

使用遗留插件应用程序:

 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")

资源链接:

  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

更新:28-06-2016:Android 支持未使用的依赖项

2017年6月,他们发布了 4.0.0 version 并将根项目名称 "gradle-lint-plugin" 重命名为—96064f4b910ccca1c727048006 "nebula-lint-plugin" 他们还 为 unused-dependency 添加了 Android 支持


2016 年 5 月,Gradle 实现了 Gradle lint 插件,用于查找和删除不需要的依赖项

Gradle Lint 插件:完整文档

Gradle Lint 插件是一个可插入和可配置的 linter 工具,用于识别和报告 Gradle 脚本和相关文件中的误用或弃用模式。

这个插件有各种规则。 未使用的依赖规则 就是其中之一。它具有三个具体特征。

  1. 删除未使用的依赖项。
  2. 将代码直接使用的传递依赖项提升为显式一阶依赖项。
  3. 将依赖项重新定位到“正确”的配置。

要应用规则,请添加:

 gradleLint.rules += 'unused-dependency'

Unused Dependency Rule 的详细信息在最后一部分给出。

要应用 Gradle lint 插件:

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

或者:

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

apply plugin: 'nebula.lint'

定义您要针对哪些规则进行 lint:

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

对于企业构建,我们建议在 init.gradle 脚本或通过 Gradle apply from 机制包含的 Gradle 脚本中定义 lint 规则。

对于多模块项目,我们建议在 allprojects 块中应用插件:

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



Unused Dependency Rule 的详细信息在本部分给出

要应用规则,请添加:

 gradleLint.rules += 'unused-dependency'

该规则检查从项目 源集中 发出的已编译二进制文件,以查找类引用并将这些引用与您在 依赖 项块中声明的依赖项相匹配。

具体而言,该规则对依赖项进行了以下调整:

1.删除未使用的依赖项

  • 删除了像 com.amazonaws:aws-java-sdk 这样的家庭式 jar,因为它们不包含任何代码

2.将代码直接使用的传递依赖关系提升为显式一阶依赖关系

  • 这具有将家庭风格的 JAR 文件(如 com.amazonaws:aws-java-sdk)分解为您实际使用的部分并将它们添加为一阶依赖项的副作用

3.将依赖项重新定位到“正确”的配置

  • Webjars 被移动到运行时配置
  • 不包含任何类 META-INF 之外的内容的 JAR 文件被移动到运行时
  • ‘xerces’、’xercesImpl’、’xml-apis’ 应始终在运行时范围内
  • 如果没有任何可证明的编译时参考,像 mysql-connector-java 这样的服务提供者(包含 META-INF/服务的 JAR 文件)将被移动到运行时
  • 依赖项被移动到可能的最高源集配置。例如,’junit’ 被重新定位到 testCompile,除非在主源集中(很少见)对它有显式依赖。


更新:以前的插件

为了您的友好信息,我想分享一下以前的插件

  1. 找到未使用的依赖项、已声明和可传递的 Gradle 插件是 com.github.nullstress.dependency-analysis

其最新版本 1.0.3 创建于 2014 年 12 月 23 日。之后就没有任何更新了。

注意:我们的许多工程师都对 这个插件 感到困惑,因为他们只更新了版本号,没有其他任何内容。

原文由 SkyWalker 发布,翻译遵循 CC BY-SA 4.0 许可协议

nebula.lint并不太好使,一些明明代码里在使用的包,被判定为unused,删除依赖就编译出错!!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题