当排除所有传递依赖时,Gradle排除self

时间:2015-07-22 12:19:26

标签: gradle eclipse-plugin transitive-dependency maven-publish

我遇到了一个我无法解决的特定问题,如果有任何帮助,我将不胜感激。 最初我在我的Java项目中包含了一些jar依赖项作为工件唯一的依赖项。 这看起来如下:

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

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

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

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

这确保在项目B中,我在使用eclipse插件时自己排除了A的所有传递deps并自行学习。

然而已发布的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都不能在以这种方式包含A时编译Project B中的任何代码。随着它的传递依赖性,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
        }
    }
}

2 个答案:

答案 0 :(得分:1)

感谢@Peter Ledbrook让我看看其他版本。似乎这个bug已知并在gradle 2.4中修复。 GRADLE-3243 我想我没有深入挖掘。有点令人烦恼的是,2.3的gradle发行说明中的​​“已知问题”部分没有提到该错误。

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

答案 1 :(得分:0)

我认为这可能是Gradle中的一个错误。我从命令行使用Gradle 2.3和2.5测试了您的示例文件。如果我使用List list1 = Arrays.asList("a","b","c"); // works perfectly ,两个版本都可以很好地编译项目。切换到transitive = false语法会导致2.3版本中断。 Gradle 2.5继续正常工作。

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