Gradle Maven-Publish插件如何配置发布带有依赖的库

Gradle Maven-Publish插件如何配置发布带有依赖的库

我们先来看一个问题,不知道大家在使用Okhttp的时候有没有发现,我们引入Okhttp库后,在依赖列表中,会出现okio的库,导致我们只要在Gradle中配置了Okhttp的库,就会自动为我们下载okio的库,因为Okhttp的库依赖了okio,如图

Gradle Maven-Publish插件如何配置发布带有依赖的库_第1张图片

这个依赖关系,我们可以在Okhttp的Pom文件里面看到,可以到Maven的库里面去查看一下https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.9.0/,如下图
Gradle Maven-Publish插件如何配置发布带有依赖的库_第2张图片

查看Pom文件中,发现配置了dependencies的标签,所以会有这个依赖关系存在

Gradle Maven-Publish插件如何配置发布带有依赖的库_第3张图片

既然我们知道了怎么一回事,那只要往我们的Gradle里面Maven上传脚本也添加这个不就好了吗?到这里,问题出现了,去Gradle官方文档查看maven插件的API,你会发现,竟然没有如何添加dependencies结点的方法,https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPom.html

,但是好在为我们提供了另一种方法withXml,我们看一下这个方法

Gradle Maven-Publish插件如何配置发布带有依赖的库_第4张图片

我们再来看一下这个例子里面的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)
                }
            }
        }
     }
  }
}

你可能感兴趣的:(maven,java,jenkins,gradle,android)