如何排除 Gradle 生成的 POM 文件中的依赖项

How to exclude dependencies in the POM file generated by the Gradle

我正在使用 "maven" 插件将 Gradle 构建创建的工件上传到 Maven 中央存储库。我正在使用类似于以下任务的任务:

uploadArchives {
  repositories {
    mavenDeployer {
      beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

      pom.project {
        name 'Example Application'
        packaging 'jar'
        url 'http://www.example.com/example-application'

        scm {
          connection 'scm:svn:http://foo.googlecode.com/svn/trunk/'

          url 'http://foo.googlecode.com/svn/trunk/'
        }

        licenses {
          license {
            name 'The Apache License, Version 2.0'
            url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
          }
        }

      }
    }
  }
}

然而,此任务创建的 POM 文件未正确报告已在我的 Gradle 构建文件中排除的依赖项。例如:

dependencies {
    compile('org.eclipse.jgit:org.eclipse.jgit.java7:3.5.2.201411120430-r') { exclude module: 'commons-logging' }
    compile('com.upplication:s3fs:0.2.8') { exclude module: 'commons-logging' }
}

如何在生成的 POM 文件中正确管理排除的依赖项?

您可以通过过滤掉不需要的依赖项来简单地覆盖 pom 的依赖项,例如要排除 junit,您可以将以下行添加到 mavenDeployer 配置中:

pom.whenConfigured {
    p -> p.dependencies = p.dependencies.findAll { 
        dep -> dep.artifactId != "junit" 
    }
}

问题是在 exclude 定义中没有指定组而只指定了模块。

添加这两个排除项已正确添加到 POM 文件中。例如:

compile('org.eclipse.jgit:org.eclipse.jgit.java7:3.5.2.201411120430-r') { 
    exclude group: 'commons-logging', module: 'commons-logging' 
}
compile('com.upplication:s3fs:0.2.8') { 
    exclude group: 'commons-logging', module: 'commons-logging' 
}

在 Gradle 依赖项上使用 'exclude' 通常是正确的答案,但我仍然需要从 POM 中删除我的一些 "runtimeOnly" 依赖项,这使我进入了这个 Whosebug 页面.我使用 Gradle 4.7 进行的测试似乎表明使用 "compileOnly" 将依赖项完全排除在 pom 之外,但是 "runtimeOnly" 在 pom 中添加了一个 "runtime" 依赖项,在我的例子中,不是我想要的。我想不出 "standard" Gradle 将运行时依赖项排除在 POM 之外的方法。

另一个答案中显示的 pom.whenConfigured 方法适用于遗留 "maven" 插件发布,但不适用于较新的 "maven-publish" 插件。我的实验导致 "maven-publish":

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
            pom.withXml {
                asNode().dependencies.dependency.each { dep ->
                  if(dep.artifactId.last().value().last() in ["log4j", "slf4j-log4j12"]) {
                      assert dep.parent().remove(dep)
                  }
                }
            }
        }
    }
}