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

时间:2015-03-19 14:45:47

标签: maven gradle pom.xml

我正在使用“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'
          }
        }

      }
    }
  }
}

但是,此任务创建的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文件中正确管理排除的依赖项?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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' 
}

答案 2 :(得分:0)

在Gradle依赖项上使用'exclude'通常是正确的答案,但我仍然需要从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)
                  }
                }
            }
        }
    }
}