如何在Gradle中排除使用分类器(平台版本)的依赖项?

19

我的项目依赖于 'org.nd4j:nd4j-native-platform:0.6.0',这会带来传递依赖:

  • Gradle: org.nd4j:nd4j-native:linux-ppc64le:0.6.0
  • Gradle: org.nd4j:nd4j-native:macosx-x86_64:0.6.0
  • Gradle: org.nd4j:nd4j-native:windows-x86_64:0.6.0
  • Gradle: org.nd4j:nd4j-native:linux-x86_64:0.6.0

我想排除 nd4j-native:linux-ppc64le 和 nd4j-native:macosx-x86_64 ,因为我的应用程序不支持这些平台。 我在我的 Gradle 文件中写道:

configurations {
    all.collect { configuration ->
        configuration.exclude(group: 'org.nd4j', module: 'nd4j-native', classifier: 'linux-ppc64le')
    }
}

Gradle提示:

Error:(44, 0) Could not set unknown property 'classifier' for object of type org.gradle.api.internal.artifacts.DefaultExcludeRule.

看起来Gradle不支持按照分类器排除依赖。

如何排除这样的传递性依赖?

更新:Gradle允许我们排除依赖项,但如果我们有多个具有相同id和组但不同分类器的依赖项怎么办?


不是重复内容。这个主题涉及到依赖关系和分类器的具体问题。 - jreznot
@jreznot,你找到解决方案了吗? - Vadim Eksler
2
@VadimEksler 看起来 Gradle 不支持这个。 - jreznot
2个回答

3
我也遇到过类似问题。我使用了一个带有Gradle依赖的deeplearning4j库。
compile group: 'org.nd4j', name: 'nd4j-native-platform', version: '1.0.0-beta'
compile group: 'org.deeplearning4j', name: 'deeplearning4j-core', version: '1.0.0-beta'

当我使用这个工具的时候,它还会下载其他平台的分类器,其大小几乎达到了500MB。但我的使用情况只涉及Windows平台,因此我不需要Linux、Android和其他平台的其他分类器。如果我排除这个组,那么也将排除Windows的分类器。在Gradle中,据我所知,我们无法排除特定的分类器。
因此问题是如何移除特定的分类器。我发现奇怪的是,当我制作项目的JAR文件并提取JAR文件时,它显示了org.nd4j:nd4j-native:linux-ppc64le:0.6.0和其他JAR文件,但当我生成依赖树时,它没有在树中显示特定的JAR文件。
为了找出哪个特定模块和项目导入了该JAR文件,我创建了一个独立的Maven项目,并使用以下命令:
<dependency>
        <groupId>org.nd4j</groupId>
        <artifactId>nd4j-native-platform</artifactId>
        <version>1.0.0-beta</version>
    </dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-core</artifactId>
    <version>1.0.0-beta</version>
</dependency>

然后我生成了一个依赖树,它显示了依赖树中的jars。 我所做的是删除整个模块,并在特定版本的特定模块中添加所需的分类器,这对我很有效。

compile (group: 'org.deeplearning4j', name: 'deeplearning4j-core', version: '1.0.0-beta') 
{
exclude group: 'org.bytedeco.javacpp-presets', module: 'opencv-platform'
exclude group: 'org.bytedeco.javacpp-presets', module: 'leptonica-platform'
exclude group: 'org.bytedeco.javacpp-presets', module: 'hdf5-platform'

}
compile (group: 'org.nd4j', name: 'nd4j-native-platform', version: '1.0.0-beta')
{
    exclude group: 'org.bytedeco.javacpp-presets', module: 'openblas-platform'
}

compile group: 'org.nd4j', name: 'nd4j-native', version: '1.0.0-beta', classifier: "windows-x86_64"
compile group: 'org.bytedeco.javacpp-presets', name: 'openblas', version: '0.2.20-1.4.1'
compile group: 'org.bytedeco.javacpp-presets', name: 'openblas', version: '0.2.20-1.4.1', classifier: "windows-x86"
compile group: 'org.bytedeco.javacpp-presets', name: 'openblas', version: '0.2.20-1.4.1', classifier: "windows-x86_64"
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.1-1.4.1'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.1-1.4.1',classifier: "windows-x86"
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.1-1.4.1',classifier: "windows-x86_64"
compile group: 'org.bytedeco.javacpp-presets', name: 'leptonica', version: '1.75.3-1.4.1'
compile group: 'org.bytedeco.javacpp-presets', name: 'leptonica', version: '1.75.3-1.4.1',classifier: "windows-x86"
compile group: 'org.bytedeco.javacpp-presets', name: 'leptonica', version: '1.75.3-1.4.1',classifier: "windows-x86_64"

采取这种方法,可以将我的jar文件大小减少到近 250MB


2

如何排除这样的传递依赖关系?

我认为,唯一的方法是按模块或组排除所有传递依赖关系,并手动提供应用程序支持的平台所需的库依赖项。因为在依赖声明中支持分类器。

同样的方式也可以处理这种情况,当您有多个具有相同模块和组但具有不同分类器的依赖项时,只需手动添加带有其分类器属性的依赖项即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接