如何排除 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)
}
}
}
}
}
}
我正在使用 "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)
}
}
}
}
}
}