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

2024-02-23

我想在我的项目中找到未使用的依赖项。 Gradle 中有类似 Maven 的功能吗?


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

我为 Kotlin 用户添加了 2 种配置。

  • 使用插件 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 https://plugins.gradle.org/plugin/com.faire.gradle.analyze
  2. https://github.com/Faire/gradle-kotlin-buildozer https://github.com/Faire/gradle-kotlin-buildozer
  3. https://discuss.gradle.org/t/detecting-unused-projects-dependency/25522 https://discuss.gradle.org/t/detecting-unused-projects-dependencies/25522

更新:2016 年 6 月 28 日:Android 对未使用依赖项的支持

In 2017年6月,他们已经发布了4.0.0 version并重命名根项目名称"gradle-lint-plugin" to "nebula-lint-plugin"。他们还添加了安卓支持 未使用的依赖项.


In May 2016Gradle 已经实现了Gradle lint 插件 https://github.com/nebula-plugins/gradle-lint-plugin用于查找和删除不需要的依赖项

Gradle Lint 插件:完整文档 https://github.com/nebula-plugins/gradle-lint-plugin/wiki

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

这个插件有各种规则。未使用的依赖规则 https://github.com/nebula-plugins/gradle-lint-plugin/wiki/Unused-Dependency-Rule是其中之一。它具有三个具体特征。

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

要应用该规则,请添加:

gradleLint.rules += 'unused-dependency'

的细节未使用的依赖规则 https://github.com/nebula-plugins/gradle-lint-plugin/wiki/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'

定义您想要检查哪些规则:

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

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

对于多模块项目,我们建议在allprojects block:

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


的细节未使用的依赖规则 https://github.com/nebula-plugins/gradle-lint-plugin/wiki/Unused-Dependency-Rule这部分给出了

要应用该规则,请添加:

gradleLint.rules += 'unused-dependency'

该规则检查从您的项目生成的已编译的二进制文件源集 https://docs.gradle.org/current/userguide/java_plugin.html#N14E7A查找类引用并将这些引用与您在文件中声明的依赖项进行匹配依赖关系 https://docs.gradle.org/current/userguide/java_plugin.html#N15632 block.

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

1. 删除未使用的依赖项

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

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

  • 这会产生破坏家庭风格 JAR 文件的副作用,例如 com.amazonaws:aws-java-sdk,进入您实际所在的部分 使用并将它们添加为一阶依赖项

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

  • Webjar 已移至运行时配置
  • 不包含任何类的 JAR 文件andMETA-INF 之外的内容是 移至运行时
  • 'xerces'、'xercesImpl'、'xml-apis' 应始终处于运行时范围
  • 服务提供者(包含 META-INF/服务的 JAR 文件),例如 如果没有任何可证明的情况,mysql-connector-java 将移至运行时 编译时参考
  • 依赖项移至最高源集配置 可能的。例如,“junit”被重新定位到 testCompile,除非 在主要源集中对它有明确的依赖性(罕见)。


更新:以前的插件

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

  1. 查找未使用的依赖项、已声明的和可传递的依赖项的 Gradle 插件是com.github.nullstress.dependency-analysis https://plugins.gradle.org/plugin/com.github.nullstress.dependency-analysis

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

注意:我们的许多工程师都感到困惑这个插件 https://github.com/wfhartford/gradle-dependency-analyze像他们 只更新了版本号,没有更新其他内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • InvalidOperationException 与 ArgumentException [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我知道摘要和描述 但是如果 ARGU
  • 如何恢复打乱的数据流管道的顺序?

    我有一个数据流管道 由多个处理异构文档 XLS PDF 等 的块组成 每种类型的文档均由专门的人员处理TransformBlock 在管道的末端我有一个ActionBlock它接收所有处理后的文档 并将它们一一上传到网络服务器 我的问题是
  • 轻量级 C++ SAX XML 解析器

    我知道至少三个轻量级 C XML 解析器 RapidXML http rapidxml sourceforge net TinyXML http sourceforge net projects tinyxml and PugiXML ht
  • Ruby 1.9.1 中的枚举器如何工作?

    这个问题不是关于如何在 Ruby 1 9 1 中使用枚举器 而是我很好奇它们是如何工作的 这是一些代码 class Bunk def initialize h 1 100 end def each if block given enum f
  • 如何在单击时移除按钮周围的焦点

    单击按钮后 我的按钮周围都会突出显示 这是在 Chrome 中
  • 如何使用“apollo-server”加载 .graphql 文件?

    我目前正在使用单独的加载 GraphQL 架构 graphql文件 但它封装在字符串中 schema graphql const schema type CourseType id String name String type Query
  • 单独读取 csv 文件中的列名

    我有一个包含以下列的 csv 文件 身份证号 姓名 年龄 性别 接下来是上面各列的许多值 我试图单独读取列名并将它们放入列表中 我正在使用 Dictreader 这给出了正确的详细信息 with open details csv as cs
  • 如何使用图像和标签制作自定义 UIBarButtonItem?

    我想制作一个包含图像和文本的自定义 UIBarButtonItem 如下所示 我尝试子类化 UIBarButtonItem 并重写此方法 UIView customView if self storedView UIView temp UI
  • TreeMap 中的重复键[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有下面的树图代码 我在其中存储重复的密钥 它似乎覆盖了现有的密钥 TreeMap
  • 使用 JavaScript 更改 SharePoint 列表的权限

    我有一个创建列表的应用程序 我希望应用程序也将列表权限设置为仅允许管理员对列表进行更改 我知道如何隐藏列表 但我知道这不会阻止聪明的用户输入列表的 URL 并进行修改 我没有看到使用 JavaScript 更改列表权限的方法 我可以使用的列
  • 如何在 Silverlight 应用程序中显示容器的 Azure blob 列表?

    如何在 Silverlight 应用程序中显示容器的 Azure blob 列表 我知道如何在常规 Net 中执行此操作 但我需要它在银光中 我可以上传 但我想要显示已上传内容的列表 对于 Silverlight 来说是这样的 CloudS
  • 如何修复 SVN 导入行结尾错误?

    我必须导入一个巨大的 SVN 存储库 并将其从一台服务器传输到另一台服务器 所以我从旧服务器导出它 svnadmin dump gt archive svn 并将其导入新的 svnadmin load lt archive svn 在导入过
  • 多态模式匹配导致类型不明确

    灵感来自无法匹配具有约束的多态元组 https stackoverflow com questions 57137421 cannot match on polymorphic tuples with constraints 并基于随后的c
  • AppFabric 1.0错误服务器集合不能为空

    当我运行简单的程序时 出现以下错误Windows Server 应用程序结构 1 0演示控制台应用程序 ErrorCode
  • Marshmallow 上本机 WebView 中的 Instagram 链接

    最近我注意到当你尝试调用时会出现一个非常奇怪的错误https www instragram com https www instagram com 当您的智能手机运行时在网络视图中安卓 6 棉花糖 问题是 屏幕始终保持空白 只有中间那个小
  • 在 Wagtail 中创建可重用字段集的方法?

    我正在评估 Wagtail 看看是否能在我的公司中找到它与 Wordpress 和 Drupal 一起的位置 到目前为止 我认为它很有趣并且非常喜欢其中的很多内容 但是有一件事我真的很喜欢 但找不到方法来实现 我的商店使用模式库 原子设计
  • 在 Virtual Box 中调试来宾操作系统的工具

    我只是交叉发布了我在 virtualbox org 上提出的相同问题 如果不违反任何规则 我很乐意了解更多相关信息 因为 stackoverflow 承诺会更加动态 你好 我做了一些搜索 但找不到任何工具可以从虚拟盒中的早期启动中调试来宾系
  • 有没有办法向 ADO.NET 实体框架中的关联添加额外的字段?

    我希望能够对多对多关系进行建模 其中包含有关该关系的额外详细信息 例如 Person int id String name Project int id String name ProjectPerson Person id Project
  • 使用 .NET 的稳定 RSS 阅读器

    我一直在寻找一个稳定的 NET RSS Atom 库 最好是开源的 比如 Adob e 创建的 AS3 Syndicate Library 我想在我的基于 NET 的网站中集成 RSS 源 另外 是否有适用于同一个 RSS 提要阅读器的 J
  • 如何在 Gradle 中查找/删除未使用的依赖项

    我想在我的项目中找到未使用的依赖项 Gradle 中有类似 Maven 的功能吗 Kotlin 用户更新 2021 年 12 月 17 日 检测 Kotlin 项目中缺失或多余的构建依赖项 版本 1 0 9 最新 我为 Kotlin 用户添