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

pdi*_*aso 6 gradle pom.xml maven

我正在使用"maven"插件将Gradle build创建的工件上传到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'
          }
        }

      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,此任务创建的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' }
}
Run Code Online (Sandbox Code Playgroud)

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

Amn*_*hot 7

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

pom.whenConfigured {
    p -> p.dependencies = p.dependencies.findAll { 
        dep -> dep.artifactId != "junit" 
    }
}
Run Code Online (Sandbox Code Playgroud)


ack*_*er9 5

在 Gradle 依赖项上使用“排除”通常是正确的答案,但我仍然需要从 POM 中删除一些“runtimeOnly”依赖项,这些依赖项引导我进入此 StackOverflow 页面。我使用 Gradle 4.7 的测试似乎表明,使用“compileOnly”将依赖项完全排除在 pom 之外,但“runtimeOnly”在 pom 中添加了“运行时”依赖项,在我的情况下,这不是我想要的。我无法找出将运行时依赖项排除在 POM 之外的“标准”Gradle 方法。

另一个答案中显示的方法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)
                  }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


pdi*_*aso 3

问题是在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' 
}
Run Code Online (Sandbox Code Playgroud)