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

时间:2016-12-25 09:22:43

标签: maven gradle dependency-management

在我的项目中,我依赖于' 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')
    }
}
格拉德说:

  

错误:(44,0)无法设置未知属性'分类器'对于org.gradle.api.internal.artifacts.DefaultExcludeRule类型的对象。

似乎gradle不支持分类器的排除。

如何排除这种传递依赖?

更新:Gradle允许我们排除依赖关系,但如果我们有多个依赖关系具有相同的id和group但不同的分类器呢?

2 个答案:

答案 0 :(得分:1)

我也面临同样的问题。我已经使用了具有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>

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

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

答案 1 :(得分:0)

  

如何排除这种传递依赖?

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

和处理这种情况的方式相同,当你有相同的模块和grooup,但有不同的分类器的许多依赖。只需使用它的分类器属性手动添加这些依赖项。