我正在使用“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文件中正确管理排除的依赖项?
答案 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)
}
}
}
}
}
}