Gradle Maven-Publish插件如何配置发布带有依赖的库
我们先来看一个问题,不知道大家在使用Okhttp的时候有没有发现,我们引入Okhttp库后,在依赖列表中,会出现okio的库,导致我们只要在Gradle中配置了Okhttp的库,就会自动为我们下载okio的库,因为Okhttp的库依赖了okio,如图
这个依赖关系,我们可以在Okhttp的Pom文件里面看到,可以到Maven的库里面去查看一下https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.9.0/,如下图
查看Pom文件中,发现配置了dependencies的标签,所以会有这个依赖关系存在
既然我们知道了怎么一回事,那只要往我们的Gradle里面Maven上传脚本也添加这个不就好了吗?到这里,问题出现了,去Gradle官方文档查看maven插件的API,你会发现,竟然没有如何添加dependencies结点的方法,https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPom.html
,但是好在为我们提供了另一种方法withXml,我们看一下这个方法
我们再来看一下这个例子里面的asNode方法,从官方API找到该方法的说明
asNode方法能够返回一个当前的pom的Groovy结点,这样我们就可以操作这个结点了,我们可以像下面这样,添加一个依赖库,在maven标签里面添加pom.withXml方法,publish完整脚本可以查看我的这篇文章:https://blog.csdn.net/xiaozeiqwe/article/details/117379335
publishing {
publications {
maven(MavenPublication) {
groupId GROUP_ID
artifactId ARTIFACT_ID
version VERSION_NAME
pom {
............
}
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', 'com.squareup.okhttp3')
dependencyNode.appendNode('artifactId', 'okhttp')
dependencyNode.appendNode('version', '4.9.0')
}
}
}
}
我们还可以依靠Gradle的dependencies依赖关系来批量处理添加我们的Maven Publish结点,并且还能添加exclusion选项
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
configurations.implementation.allDependencies.withType(ModuleDependency) { ModuleDependency dp -> if (dp.version != "unspecified") { // 过滤项目内library引用
if("com.squareup.okhttp3" == dp.group){
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dp.group)
dependencyNode.appendNode('artifactId', dp.name)
dependencyNode.appendNode('version', dp.version)
// for exclusions
if (dp.excludeRules.size() > 0) {
def exclusions = dependencyNode.appendNode('exclusions')
dp.excludeRules.each { ExcludeRule ex ->
def exclusion = exclusions.appendNode('exclusion')
exclusion.appendNode('groupId', ex.group)
exclusion.appendNode('artifactId', ex.module)
}
}
}
}
}
}