159

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

4

6 回答 6

81

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

2017年6 月,他们发布4.0.0 version 了根项目名称并将其重命名"gradle-lint-plugin""nebula-lint-plugin". 他们还为未使用的依赖项添加了 Android 支持


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

Gradle Lint 插件:完整文档

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

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

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

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'

未使用的依赖规则的细节在最后一部分给出。

要应用 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
}


本部分给出了未使用的依赖规则的详细信息

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'

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

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

1.删​​除未使用的依赖项

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

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

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

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

  • Webjar 被移动到运行时配置
  • 不包含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 日。之后就没有任何更新了。

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

于 2016-06-02T05:16:54.143 回答
9

前面的答案中提到的项目似乎已经死了。我使用gradle-dependency-analyze。设置很简单:

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

apply plugin: 'ca.cutterslade.analyze'

然后做:

$ gradle analyzeDependencies
于 2015-10-30T13:25:50.510 回答
8

我刚刚了解了这个:https ://plugins.gradle.org/plugin/com.autonomousapps.dependency-analysis

Github

从外观上看,它正在积极开发中,但我尚未对其进行测试。

编辑:实际上它非常棒,它提供了很多建议(例如,是否使用 api 与实现)

于 2020-02-17T12:47:47.617 回答
7

使用Gradle Dependency Analysis Plugin我很幸运。要开始使用它,请将以下两件事添加到您的 Gradle 构建脚本中。

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

apply plugin: "dependencyAnalysis"

一旦这些就位,运行gradle analyze. 如果有未使用的依赖项,您将收到构建失败,显示类似于以下文本的输出,以及未使用的依赖项列表(声明的和传递的)。如果您想通过 CI 构建强制不存在未使用的依赖项,那么构建失败非常方便。

:foo:analyze FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':foo:analyze'.
> The project has unused declared artifacts
于 2015-06-01T19:49:54.530 回答
0

编者注:此答案已过时。请看上面的答案

你可以试试com.github.nullstress.dependency-analysis Gradle 插件

构建用于所有 Gradle 版本的脚本片段:

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

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

为 Gradle 2.1 中引入的新的孵化插件机制构建脚本片段:

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

此外,Gradle 论坛中有一个关于此的主题(Is there a Gradle 等价于“mvn dependency:analyze”?)。

于 2015-03-15T18:38:11.457 回答
0

大多数历史答案的项目都已死,但截至 2016 年 5 月 30 日, gradle-dependency-analyze似乎还活着。

于 2016-06-01T19:58:51.180 回答