在我的项目中,我依赖于' org.nd4j:nd4j-native-platform: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但不同的分类器呢?
答案 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,但有不同的分类器的许多依赖。只需使用它的分类器属性手动添加这些依赖项。