Java 如何在Gradle中排除可传递的jar依赖关系?

Java 如何在Gradle中排除可传递的jar依赖关系?,java,android,gradle,dependency-management,Java,Android,Gradle,Dependency Management,我的项目依赖于依赖项A和依赖项B 依赖项A也依赖于依赖项B,但它的版本不同 问题在于项目A的build.gradle依赖项B直接使用file和fileTree方法作为jar包含: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile files('libs/B.jar') } 我的项目的build.gradle如下所示: dependencies { compile 'com.B

我的项目依赖于依赖项A和依赖项B

依赖项A也依赖于依赖项B,但它的版本不同

问题在于项目A的build.gradle依赖项B直接使用file和fileTree方法作为jar包含:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/B.jar')
}
我的项目的build.gradle如下所示:

dependencies {
    compile 'com.B:B:myvesion'
    compile('com.A:A:theirversion') {
        exclude module: 'B'
    }
}
但我的构建失败,出现以下异常:

Execution failed for task ':myproject:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lcom/B/someclass;

我想从我的项目中排除B的jar版本,并使用我的版本。我该怎么做?在我的例子中,exclude指令似乎不起作用。

您不能对jar文件执行此操作


可以排除pom文件中描述的可传递依赖项。jar文件不是可传递的依赖项。

您不能对jar文件执行此操作


可以排除pom文件中描述的可传递依赖项。jar文件不是一个可传递的依赖项。

你不能简单地将依赖项从使用jar B更改为使用模块B作为内部版本。gradle?@ahasbini我可以这样做,但我不必因为a而降级依赖项版本。我可能只在我的版本中使用一些更新的API。明白了,但问题在于jars Gradle无法管理它们或它们的内部依赖关系。这意味着,即使您将project build.gradle中的依赖项从使用模块B切换到使用jar of B,我也不完全确定它是否会导致相同包B的重复jar,因此不会忽略其中一个jar,从而像以前一样引发构建错误。以前没有尝试过,所以如果你能证实我的理论,我将不胜感激。作为进一步澄清问题的旁注,排除模块:“B”在这里被忽略,因为jar B不是pom式的定义依赖项,它是a的一部分,好像它是硬编码的,a没有声明B是什么。我为Android解决了类似的问题,也许你也可以使用这个简单Java的方法:你能不能简单地将依赖项从使用jar B改为使用模块B作为内置的。gradle?@ahasbini我可以做到,但我不应该因为A而降级依赖项版本。我可能只在我的版本中使用一些更新的API。明白了,但问题在于jars Gradle无法管理它们或它们的内部依赖关系。这意味着,即使您将project build.gradle中的依赖项从使用模块B切换到使用jar of B,我也不完全确定它是否会导致相同包B的重复jar,因此不会忽略其中一个jar,从而像以前一样引发构建错误。以前没有尝试过,所以如果你能证实我的理论,我将不胜感激。作为进一步澄清问题的旁注,排除模块:“B”在这里被忽略,因为jar B不是pom式的定义依赖项,它是a的一部分,好像它是硬编码的,a没有声明B是什么。我为Android解决了类似的问题,可能您也可以使用以下简单Java配方: