Gradle 排除所有传递依赖时排除自身

Gradle excludes self when excluding all transitive dependencies

我遇到了一个我一直无法解决的特定问题,如果您能提供帮助,我将不胜感激。 最初我在我的 Java 项目中包含了一些 jar 依赖项作为仅工件依赖项。 这看起来像下面这样:

    compile "com.example:projectA:1.0.0@jar"

到目前为止一切顺利。我们称这个项目为 'A'。我已将项目 A 包含在另一个 Java 项目 B 中,同样是 gradle。我注意到在 B 中使用 A 时,使用 maven-publish 发布的 A 并没有在其 pom 文件中排除其所有传递依赖项。

所以我开始使用传递标志:

dependency("com.example:projectA:1.0.0") {
    transitive = false
}

这确保了在项目 B 中,我在使用 eclipse 插件和 gradle 本身时排除了 A 的所有传递依赖。

但是已发布的 pom.xml 中缺少排除项的问题仍然存在。 然后我发现这个问题在撰写本文时和我的 gradle 版本似乎已解决:GRADLE-2945

所以我尝试了以下方法:

dependency("com.example:projectA:1.0.0") {
    exclude group: '*'
}

pom 文件现在根据 maven doc:

正确地具有传递依赖项所需的排除规则
<groupId>com.example</groupId>
<artifactId>projectA</artifactId>
<version>1.0.0</version>
<exclusions>
  <exclusion>
    <groupId>*</groupId>
    <artifactId>*</artifactId>
  </exclusion>
</exclusions>

但是这会导致一系列不同的问题;当使用 compileJava 任务时,eclipse 和 gradle 本身都无法编译项目 B 中以这种方式包含 A 的任何代码。连同它的传递依赖 A 本身也消失了。

但奇怪的是,根据 dependencies 任务,它是编译类路径的一部分。

我正在使用 JRE7 和 gradle 2.3 以及 eclipse 4.41,我们使用 nexus 作为内部 maven 存储库。

我希望我不需要使用传递标志并通过添加所需的排除项手动操作生成的 pom 文件。


使用 dbcp 作为项目 A 重现问题的示例项目:

Main.java:

import org.apache.commons.dbcp.BasicDataSource;
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World");
        BasicDataSource ds = new BasicDataSource();
    }
}

build.gradle:

version = '0.0.1'
group = 'com.example'

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'

repositories {
    mavenCentral()
}

dependencies {
    compile ('commons-dbcp:commons-dbcp:1.4')
    {
        transitive=false
    }
//  {
//      exclude group: '*'
//  }
} 

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

我认为这可能是 Gradle 中的错误。我从命令行用 Gradle 2.3 和 2.5 测试了你的示例文件。如果我使用 transitive = false,两个版本都可以很好地编译项目。切换到 exclude group: '*' 语法会导致 2.3 版本中断。 Gradle 2.5 继续正常工作。

简而言之,Gradle 升级应该可以解决您的问题。

感谢@Peter Ledbrook 让我查看其他版本。该错误似乎已在 gradle 2.4 中已知并修复。 GRADLE-3243 我想我没有深入挖掘。仍然有点令人烦恼的是 gradle 2.3 发行说明的 'Known issues' 部分没有提及该错误。

如前所述,gradle 的简单升级应该可以解决问题。