如何查找\删除gradle中的未使用的依赖关系

我想在我的项目中find未使用的依赖项。 Gradle中有没有像Maven一样的特性?

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

20176月 ,他们发布了4.0.0 version ,并将根项目名称"gradle-lint-plugin"更名为"nebula-lint-plugin" 。 他们还将Android支持添加到未使用的依赖项中


20165月, Gradle已经实现了gradle lint插件来查找和删除不需要的依赖

Gradle Lint插件:完整文档

Gradle Lint插件是一个可插入和可configuration的短信工具,用于识别和报告Gradle脚本和相关文件中滥用或弃用的模式。

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

  1. 删除未使用的依赖关系。
  2. 促进由代码直接使用的传递依赖到显式的一阶依赖。
  3. 将依赖关系重新定位到“正确”configuration。

要应用规则,请添加:

 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' 

定义你想要克服的规则:

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

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

对于多模块项目,我们build议将该插件应用于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)促进由代码直接使用的传递依赖到显式的一阶依赖

  • 这有一个副作用,把com.amazonaws:aws-java-sdk这样的家庭风格的jar分解成你实际使用的部分,然后把它们作为一阶依赖

3)将依赖关系重新定位到“正确”configuration

  • Webjars被移动到运行时configuration
  • 不包含META-INF之外的类和内容的Jars被移动到运行时
  • 'xerces','xercesImpl','xml-apis'应该总是在运行时范围内
  • 如果没有可certificate的编译时引用,那么像mysql-connector-java这样的服务提供者(包含META-INF /服务的jar)将被移动到运行时
  • 依赖关系被移至可能的最高源集configuration。 例如,'junit'被重定位到testCompile,除非在主源集合(罕见)中存在明确的依赖关系。


更新:以前的插件

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

  1. 发现未使用的依赖关系,声明和传递的Gradle插件是com.github.nullstress.dependency-analysis

最新版本1.0.3是2014年12月23日创build的 。 之后,没有更新。

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

在早些时候的答案中提到的项目似乎已经死了。 我使用gradle依赖分析 。 安装很简单:

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

然后做:

 $ gradle analyzeDependencies 

使用Gradle依赖分析插件我有很多运气。 要开始使用它,请将以下两项内容添加到您的Gradle构build脚本中。

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

 apply plugin: "dependencyAnalysis" 

一旦到位,运行gradle analyze 。 如果存在未使用的依赖关系,则会显示构build失败,显示类似于以下文本的输出,以及未使用的依赖项(声明和传递)的列表。 如果你想强制通过CI构build应该没有未使用的依赖关系,构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 

大部分历史答案的项目都是死的,但是在写这篇文章时(最近一次提交是在两天前), 依赖于分析的分析似乎还活着。

这不是一个内置的function,我不知道第三方插件(但也许有一个)。

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

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

 buildscript { repositories { jcenter() } dependencies { classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3" } } apply plugin: "com.github.nullstress.dependency-analysis" 

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

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

另外,在gradle论坛中有一个线程( 是否有一个Gradle等价于“mvn dependency:analyze”? )。