7

我正在尝试从我的 Android 项目中删除传递依赖项,但由于某种原因exclude,当我尝试从我的特定依赖项中删除依赖项时它不起作用。

例如我想support-annotations从我的项目中删除

如果我使用

configurations {
    all*.exclude group: 'com.android.support', module:'support-annotations'
}

依赖项被排除在依赖关系树之外。我可以使用 ./gradlew app:dependencies 查看依赖树在此处输入图像描述

但如果我使用

 compile('com.android.support:support-v4:23.4.0')
            {
                exclude group: 'com.android.support', module:'support-annotations'
            }

然后我仍然在依赖树中看到依赖。在此处输入图像描述

所以我的问题是,为什么当我尝试从特定依赖项中删除依赖项时它不起作用?

更新1:

还有谁能告诉我star树中依赖项旁边的 (*) 符号代表什么?

更新 2

我也在使用Fresco我用 Fresco 尝试了同样的事情,并且exclude 规则似乎适用于它

Fresco的依赖树 在此处输入图像描述

imagepipeline-base当我在 Fresco 中排除时的依赖树

compile("com.facebook.fresco:fresco:0.9.0")
            {
                exclude group: 'com.facebook.fresco', module: 'imagepipeline-base'
            }

在此处输入图像描述

如您所见,imagepipeline-base依赖项被排除在外。所以我不知道为什么这不适用于 Android Support Annotations 传递依赖

4

2 回答 2

6

所以我在我的一位朋友的帮助下解决了这个问题。我无法删除的原因support-annotation是因为大多数其他依赖项都support-v4用作传递依赖项,并且那些support-v4也有自己的support-annotation.

现在有2个解决方案

解决方案1:

support-annotation从包含support-v4传递依赖项的所有依赖项中排除。

解决方案2:

support-annotation仅从我的support-v4依赖项中排除,并support-v4从所有其他具有support-v4传递依赖项的依赖项中删除依赖项。

注意:使用上述方法之一,我能够解决我的问题并弄清楚当从多个依赖项中引用传递依赖项时我们如何删除传递依赖项。

关于( * )符号,它意味着已经显示了该依赖关系的依赖关系树。gradle 不再显示这些依赖项的整个树,而是显示( * )符号。

示例build.gradle文件可在此处获得

于 2016-05-26T16:41:27.880 回答
1

还有更优雅的解决方案:您可以在build.gradle文件中使用configueation.all块,如下例所示:

configurations.all {
  exclude group: 'com.android.support', module: 'support-annotations'
}

它应该排除应用程序中所有内部模块的所有传递依赖项。

于 2021-05-31T16:38:25.343 回答