1

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

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

到目前为止,一切都很好。我们称这个项目为“A”。我已经将项目 A 包含在另一个 Java 项目 B 中,再次使用 gradle。我注意到使用 maven-publish 发布的 A 在 B 中使用它时并没有在其 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: '*'
}

根据maven doc ,pom 文件现在正确地具有传递依赖项的所需排除规则:

<groupId>com.example</groupId>
<artifactId>projectA</artifactId>
<version>1.0.0</version>
<exclusions>
  <exclusion>
    <groupId>*</groupId>
    <artifactId>*</artifactId>
  </exclusion>
</exclusions>

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

奇怪的是,根据依赖项任务,它是编译类路径的一部分。

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

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


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

主.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();
    }
}

构建.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
        }
    }
}
4

2 回答 2

1

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

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

于 2015-07-23T09:20:31.853 回答
0

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

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

于 2015-07-22T17:48:07.407 回答