> 文档中心 > Android Gradle7.0上传Library到maven仓库

Android Gradle7.0上传Library到maven仓库


原因

日常开发的时候我们经常引用一个依赖库然后就可以使用里面的API,非常方便。
自身也喜欢写一些工具类和库,写了几年了现在手里依然没有一个经常维护的库。就连Log工具类也换了好多个。就有一个想法以后换项目直接引用一行依赖,依赖有问题更新依赖就行。也不存在换公司换项目代码不好复制和替换。

implementation'com.squareup.okhttp3:okhttp:4.8.0'

本地环境

Gradle7.0
Android Studio Arctic Fox | 2020.3.1 Patch 4
正常网络

一、Sonatype 账号

注册账号

需要先注册登录 Sonatype,访问 https://issues.sonatype.org

Android Gradle7.0上传Library到maven仓库

邮箱建议使用常用的邮箱,因为后面开通权限是人工审核,有什么结果都是邮件通知

Android Gradle7.0上传Library到maven仓库

申请上传权限

新建项目
https://issues.sonatype.org/secure/Dashboard.jspa

Android Gradle7.0上传Library到maven仓库

按照下面提示填入内容
Android Gradle7.0上传Library到maven仓库

然后等待对方回复,对方回复了会发邮件给你。正常的情况他会让在github创建一个他指定名的公开库的。

Android Gradle7.0上传Library到maven仓库

你只需根据他的评论在github创建仓库。记得修改状态等待,再次核实
Android Gradle7.0上传Library到maven仓库

二、配置Gradle

创建一个Gradle文件,取名按自己来。 复制下面代码进行修改

// 必备插件apply plugin: 'maven-publish'apply plugin: 'signing'// 刚才申请的GROUP_ID def GROUP_ID = 'io.github.xxx'// 名称def ARTIFACT_ID = 'JavaTools'// 版本def VERSION_NAME = '0.0.1'// 下面是介绍是别人在MavenCentral仓库搜索到你可以看到的消息def DESCRIPTION = '一个简化xxx开发的x库'def GIT_LOCATION = 'github.com/ohuo133233/Tools'def GIT_LOCATION_URL = 'https://' + GIT_LOCATION//仓库地址 (直接复制不用修改)def MAVEN_URL = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"// 注册 Sonatype的用户名和密码def nexusUsername = 'xxx'def nexusPassword = 'xxx'task sourceJar(type: Jar) {    if (hasAndroidPlugin()) { println "======> Android" from android.sourceSets.main.java.srcDirs //noinspection GroovyAccessibility archiveClassifier = 'sources'    } else if (hasJavaPlugin()) { println "======> Java" from sourceSets.main.allSource //noinspection GroovyAccessibility archiveClassifier = 'sources'    }}afterEvaluate { project ->    tasks.all { Task task -> if (task.name.equalsIgnoreCase('publishAarPomPublishPublicationToSnapshotsRepository')) {     task.dependsOn tasks.getByName('assemble') }    }}def hasJavaPlugin() {    if (plugins.hasPlugin("java-library")) { return true    }    return false}def hasAndroidPlugin() {    if (plugins.hasPlugin("com.android.library")) { return true    }    return false}publishing {    println "======> ${project.name}"    println "====> the aar path is " + "$buildDir/outputs/aar/${project.name}-release.aar"    println "====>" + MAVEN_URL    println "====>" + VERSION_NAME    publications { aarPomPublish(MavenPublication) {     groupId GROUP_ID     artifactId ARTIFACT_ID     version VERSION_NAME     artifact(sourceJar)     artifact("$buildDir/outputs/aar/${project.name}-release.aar")     pom {  packaging 'aar'  name = ARTIFACT_ID  description = DESCRIPTION  url = GIT_LOCATION_URL  licenses {      license {   name = 'The Apache License, Version 2.0'   url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'      }  }  developers {  // 同样是展示到 https://search.maven.org 的信息      developer {   id = 'my_maven'   name = 'wangxiansheng'   email = '[email protected]'      }  }  scm {      connection = 'scm:git:' + GIT_LOCATION + '.git'      developerConnection = 'scm:git:ssh://' + GIT_LOCATION + '.git'      url = GIT_LOCATION_URL  }     }     pom.withXml {  def dependenciesNode = asNode().appendNode('dependencies')  configurations.implementation.allDependencies.each {      if (it.version != "unspecified") { // 过滤项目内library引用   println "=====>" + it.properties   println "=====>" + it.group + "  " + it.name + it.version   if (it.group == null || it.name == null || it.version == null) return   if (it.group == group) return   def dependencyNode = dependenciesNode.appendNode('dependency')   dependencyNode.appendNode('groupId', it.group)   dependencyNode.appendNode('artifactId', it.name)   dependencyNode.appendNode('version', it.version)   if (it.excludeRules.size() > 0) {def exclusionsNode = dependencyNode.appendNode('exclusions')it.excludeRules.each { rule ->    def exclusionNode = exclusionsNode.appendNode('exclusion')    exclusionNode.appendNode('groupId', rule.group)    exclusionNode.appendNode('artifactId', rule.module)}   }      }  }     } }    }    repositories { maven {     name "snapshots"     url MAVEN_URL     credentials {  username = nexusUsername  password = nexusPassword     } }    }}// signing 必须在 publishing 配置之后signing {    sign publishing.publications.aarPomPublish}

在自己要发布的library下的build.gradle中引用

apply from: 'xxx.gradle'

放到顶部就行,然后Sync Now。 查看gradle是否有publishing task

Android Gradle7.0上传Library到maven仓库

三、GPG 签名

跳转https://www.gpg4win.org/get-gpg4win.html 去下载Gpg4win

Android Gradle7.0上传Library到maven仓库

创建密钥

Android Gradle7.0上传Library到maven仓库

选择创建个人openPGP密钥

Android Gradle7.0上传Library到maven仓库

一定要使用密码保护生成勾选生成密钥

Android Gradle7.0上传Library到maven仓库
Android Gradle7.0上传Library到maven仓库
Android Gradle7.0上传Library到maven仓库
Android Gradle7.0上传Library到maven仓库

上传结束建议去 https://keys.openpgp.org/去查一下
如果出现出现 gpg: keyserver send failed ,就按下面步骤来。

Android Gradle7.0上传Library到maven仓库

如果没有可以手动上传,点击upload,选择文件上传成功再查询。

Android Gradle7.0上传Library到maven仓库

导出私钥

Android Gradle7.0上传Library到maven仓库
先修改文件格式为gpg格式,再保存。先保存后修改无效
Android Gradle7.0上传Library到maven仓库

配置密钥

在 C:\Users\Hello.gradle找到 gradle.properties文件

Android Gradle7.0上传Library到maven仓库

复制下面配置到gradle.properties文件

# MavenCentralsigning.keyId=FCE86F1Bsigning.password=155620110Qqq# 私钥目录 我的是在项目里面signing.secretKeyRingFile=./Admin_0xFCE86F1B_SECRET.gpgossrhUsername=my_mavenossrhPassword=155620110Www.

把私钥放到指定目录,记得忽略提交私钥,不然别人也可以发版了,哈哈。
Android Gradle7.0上传Library到maven仓库
Android Gradle7.0上传Library到maven仓库

Android Gradle7.0上传Library到maven仓库

三、发布档案

打开 https://s01.oss.sonatype.org/#welcome 点击左上角的login
Android Gradle7.0上传Library到maven仓库
Android Gradle7.0上传Library到maven仓库
查看Activity是否成功
Android Gradle7.0上传Library到maven仓库
没有问题点击colse
Android Gradle7.0上传Library到maven仓库
根据情况填入内容
Android Gradle7.0上传Library到maven仓库
等待结束,查看结果
Android Gradle7.0上传Library到maven仓库
点击release发布
Android Gradle7.0上传Library到maven仓库
根据情况输入内容
Android Gradle7.0上传Library到maven仓库
成功后刷新应该就没有记录了。
Android Gradle7.0上传Library到maven仓库
等待几个小时后可以在 https://search.maven.org/ 查询发布结果

参考资料

Demo:https://github.com/ohuo133233/Tools
参考别人的文档
https://blog.csdn.net/csdn_lqr/article/details/115979598