一、前言:
由于Jcenter已經停止服務了,所以我們現在發布庫一般是要發布到Maven Central;Maven Central和Jcenter一樣也是一個公共的倉庫,發布在上面的庫可供自己和他人使用;Android Studio 4.2開始,Google已經把MavenCentral作為gradle中的默認倉庫配置;
二、發布庫(jar/aar)到MavenCentral的流程
1.Sonatype Jira相關設定
我們首先要在 Sonatype Jira上注冊一個賬號;
然后在https://issues.sonatype.org/projects
上創建一個issure


groupId:我們最好是使用自己的gtihub地址,這樣比較容易驗證,如果是自己的個人的域名也可以;我填寫的是:io.github.maqing-programmer
Project URL:我們在自己的GitHub上面新建一個倉庫即可,這里填寫這個倉庫的地址即可;我這里填寫的是:https://github.com/maqing-programmer/openlibrary
SCM url:上面的Project URL加上.gi即可,我這里填寫的是:https://github.com/maqing-programmer/openlibrary.git
創建完issure以后,會有管理員處理你的這個issue,等待管理員回復你的issue,他會告訴你,要在你的github創建一個repo,repo的名字是這個issue的id,比如我的是OSSRH-69933,管理員回復我的如下圖:

創建好之后,你需要添加評論,回復管理員已經創建好倉庫;

回復管理員之后,等待這個issue的狀態變成已解決RESOLVED狀態,

這樣,你就創建好了一個issue,用來承接對應group id下所有的庫,Sonatype Jira
基本配置就完成了;
2.簽名秘鑰申請
下載gpg4win:
去GPG官網https://www.gpg4win.org/get-gpg4win.html 下載gpg4win-3.1.14.exe;
官網最新的版本是gpg4win-3.1.15,但是下載之后,后面打開kleopatra.exe
總是報錯,所以就改成下載gpg4win-3.1.14了,打開kleopatra.exe也沒有報錯了;
下載之后,點擊,進行安裝即可;
安裝完之后,桌面應該會出現kleopatra圖示,我們點擊打開,或者在gpg4win-3.1.14的安裝目錄下/bin/下找到kleopatra.exe點擊打開也可;
打開kleopatra之后,新建秘鑰

然后選擇創建個人秘鑰:

然后輸入你的賬號、郵箱,并且勾選Protect the generated key with a passphrase.(使用密碼保護生成的密鑰)在高級設定里可以設定更詳細的,例如過期時間,但過期時間不可以太長,或報錯,

點擊新建,會要求設定一個密碼,這個密碼是私鑰密碼,后面會用到;

密碼輸入之后,點擊下一步,就會創建成功;
新建完成之后在kleopatra界面會看到你創建的秘鑰:

雙擊可查看

紅框中的8位字母,后面是是要用的;
點擊生成吊銷證書按鈕,保存下來你的吊銷證書,
然后我們進入gpg4win-3.1.14的安裝目錄下/bin/,打開cmd,或者打開CMD,然后
定位到gpg4win-3.1.14的安裝目錄下/bin/下,然后輸入
gpg --export-secret-keys -o secring.gpg命令接下來創建secring.gpg檔案
這個secring.gpg檔案,后面會用到;
然后回到主界面點擊右鍵,在服務器發布:

3.gradle準備
我們進入Android Studio中,比如我們要上傳的是一個Java Library,我們肯定是事先準備好了Android工程,然后在Android 工程中又新建了一個Java Library Module,Java Library Module下撰寫好庫的代碼之后,準備上傳;
我們要準備一個上傳的gradle腳本檔案,在Android工程的根目錄下,新建一個gradle檔案,這里我們取名為publish_jar.gradle;
apply plugin: 'maven-publish'
apply plugin: 'signing'
task sourceJar(type: Jar) {
classifier "sources"
from sourceSets.main.groovy.srcDirs
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier "javadoc"
from javadoc.destinationDir
}
javadoc {
description = "生成jar格式的javadoc,"
// 只顯示 protected 和 public 的類和成員
options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
options.author = true
options.version = true
options.header = project.name
// 靜默javadoc檢查(比如不支持@date會報錯等),jdk 8+
options.addStringOption('Xdoclint:none', '-quiet')
// 防止本地打開中文亂碼
options.addStringOption("charset", "UTF-8")
// suppress warnings due to cross-module @see and @link references;
// note that global 'api' task does display all warnings.
logging.captureStandardError LogLevel.INFO
// suppress "## warnings" message
logging.captureStandardOutput LogLevel.INFO
// 編碼一定要配置否則直接出錯
options.encoding = "UTF-8"
options.charSet = "UTF-8"
}
ext {
PUBLISH_GROUP_ID = "io.github.maqing-programmer" //
PUBLISH_ARTIFACT_ID = 'plugin' //專案名
PUBLISH_VERSION = 2.2 //版本號
}
ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.secretKeyRingFile"] = ''
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''
File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
println "Found secret props file, loading props"
Properties p = new Properties()
p.load(new FileInputStream(secretPropsFile))
p.each { name, value ->
ext[name] = value
}
} else {
println "No props file, loading env vars"
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId = 'io.github.maqing-programmer'//Sonatype Jira上設定的groupId
artifactId = 'plugin'
version = '2.2'
from components.java
artifact sourceJar
artifact javadocJar
pom {
name = 'plugin'
description = 'jiagu plugin'
url = 'https://github.com/maqing-programmer/openlibrary'
licenses {
license {
name = 'Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution = 'repo'
comments = 'A business-friendly OSS license'
}
}
developers {
developer {
id = 'maqing' //Sonatype Jira上的username
name = 'maqing' //Sonatype Jira上的username
email = '2856992713@qq.com'
}
}
scm {
//修改成你的Git倉庫地址: https://github.com/maqing-programmer/openlibrary.git
connection = 'scm:git:github.com/maqing-programmer/openlibrary.git'
developerConnection = 'scm:git:ssh://github.com/maqing-programmer/openlibrary.git'
//分支地址:
url = 'https://github.com/maqing-programmer/openlibrary/tree/master'
}
}
}
}
repositories {
maven {
// any other name that's descriptive for you
name = "Releases"
def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
// You only need this if you want to publish snapshots, otherwise just set the URL
// to the release repo directly
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
// The username and password we've fetched earlier
credentials {
username ossrhUsername
password ossrhPassword
}
}
}
}
signing {
sign publishing.publications.mavenJava
}
然后在Android工程的根目錄下的local.properties里面添加如下內容;
signing.keyId=新建的秘鑰的后8位
signing.password=新建密鑰時設定的密碼
signing.secretKeyRingFile=D\:\\key\\secring.gpg(生成的secring.gpg的位置)
ossrhUsername=Sonatype注冊的用戶名
ossrhPassword=Sonatype注冊的密碼
然后在你要提交的module下的build.gradle檔案中,尾部追加如下代碼:
apply from: '../publish_jar.gradle'
然后同步(Sync)即可
4.執行打包和上傳
上傳之前首先要打包我們的Java Library的原始碼為jar檔案,在Android Studio中右側的gradle視窗中的task中找到想要提交的Module;然后執行build任務

build任務執行完畢之后,在Java Library目錄下build/libs/目錄下會有打包好的jar檔案

然后再點擊該module下的publishReleasePublicationToReleasesRepository任務

發布任務執行完畢之后,進入Nexus Repository Manager 上,登錄,登錄的賬號就是sonatype的賬號,登錄之后左側的選單中找到Staging Repositories,點擊該選單,會看到我們的groupId對應的該庫的臨時倉庫,并且會有編號,如果有個多個臨時倉庫,就會有多個groupId-編號的臨時倉庫


然后選中我們的庫對應的臨時倉庫,點擊close關閉該庫

close成功之后,然后再點擊release,釋放該包,釋放該包成功之后,這個臨時倉庫就會不存在了;然后等待兩個小時候之后,然后我們在https://search.maven.org/ 上就可以搜索到我們的這個庫了,我么可以通過groupId,
或者通過庫名來搜索;

5.使用該庫
如果是一個普通的Java Library庫,你可以直接
implementation 'io.github.maqing-programmer:plugin:2.0’來使用該庫;
我們其實可以點擊MavenCentral上的這個庫的版本號,進入這個庫的詳情,
右邊是有這個庫在各個構建工具中如何參考的方法:



如上圖所示在gradle中就是
implementation ‘io.github.maqing-programmer:plugin:2.0’
使用這種參考方式;
上面就是上傳一個Java Library(jar)庫到MavenCentral庫中的程序;
上傳一個aar庫到MavenCentral
上傳aar庫到mavenCentral基本步驟和上傳jar庫是一樣的,不同的是我們上傳的 moule型別以及gradle準備中的上傳腳本不一樣;
1.新建要上傳的Android Library Module
首先我們要新建一個Android工程,然后新建一個Android Library Module,新建的Android Library Module好像默認是沒有res資源目錄,我么可以自己在src/main下新建一個res資源目錄,或者直接將Android工程主Module下的res資源目錄拷貝到Android Library Module下src/main下;
然后撰寫我們的庫代碼,撰寫好庫代碼之后,我們在Android Studio右側gradle task
視窗,找到我們的Android Library Module下的Tasks下的build中的build任務,執行完畢之后,在Android Library Module中的build/outputs/aar目錄下就會生成我們的aar庫檔案;

2.gradle準備
我們要準備一個上傳的gradle腳本檔案,在Android工程的根目錄下,新建一個gradle檔案,這里我們取名為publish_aar.gradle;
apply plugin: 'maven-publish'
apply plugin: 'signing'
task androidSourcesJar(type: Jar) {
classifier = 'sources'
// from sourceSets.main.java.source
from android.sourceSets.main.java.source
}
ext {
PUBLISH_GROUP_ID = "io.github.maqing-programmer" //專案包名
PUBLISH_ARTIFACT_ID = 'mylibrary' //專案名
PUBLISH_VERSION = 2.0 //版本號
}
ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.secretKeyRingFile"] = ''
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''
File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
println "Found secret props file, loading props"
Properties p = new Properties()
p.load(new FileInputStream(secretPropsFile))
p.each { name, value ->
ext[name] = value
}
} else {
println "No props file, loading env vars"
}
publishing{
publications{
release(MavenPublication) {
// The coordinates of the library, being set from variables that
// we'll set up in a moment
groupId "io.github.maqing-programmer"
artifactId "mylibrary"
version '2.0'
// Two artifacts, the `aar` and the sources
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
artifact androidSourcesJar
// Self-explanatory metadata for the most part
pom {
name = PUBLISH_ARTIFACT_ID
description = '你的專案描述'
// If your project has a dedicated site, use its URL here
url = 'https://github.com/maqing-programmer/openlibrary'
licenses {
license {
//協議型別,一般默認Apache License2.0的話不用改:
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'maqing'
name = 'maqing'
email = '2856992713@qq.com'
}
}
// Version control info, if you're using GitHub, follow the format as seen here
scm {
//修改成你的Git地址: https://github.com/maqing-programmer/openlibrary.git
connection = 'scm:git:github.com/maqing-programmer/openlibrary.git'
developerConnection = 'scm:git:ssh://github.com/maqing-programmer/openlibrary.git'
//分支地址:
url = 'https://github.com/maqing-programmer/openlibrary/tree/master'
}
// A slightly hacky fix so that your POM will include any transitive dependencies
// that your library builds upon
withXml {
def dependenciesNode = asNode().appendNode('dependencies')
project.configurations.implementation.allDependencies.each {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
repositories {
// The repository to publish to, Sonatype/MavenCentral
maven {
// This is an arbitrary name, you may also use "mavencentral" or
// any other name that's descriptive for you
name = "Releases"
def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
// You only need this if you want to publish snapshots, otherwise just set the URL
// to the release repo directly
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
// The username and password we've fetched earlier
credentials {
username ossrhUsername
password ossrhPassword
}
}
}
}
signing {
sign publishing.publications
}
然后我們在Android根目錄下的gradle.properties下增加如下配置:
VERSION_NAME=1.0.2
VERSION_CODE=2
GROUP_ID=io.github.maqing-programmer
POM_DESCRIPTION=Android Download Library
POM_URL=https://github.com/maqing-programmer/openlibrary
POM_SCM_URL=https://github.com/maqing-programmer/openlibrary/tree/master
POM_SCM_CONNECTION=scm:git:github.com/maqing-programmer/openlibrary.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://github.com/maqing-programmer/openlibrary.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=Apache 2.0
POM_DEVELOPER_ID=maqing
POM_DEVELOPER_NAME=maqing
當然和上傳jar庫一樣,也要在Android工程根目錄下的local.properties下添加如下配置
signing.keyId=新建的秘鑰的后8位
signing.password=新建密鑰時設定的密碼
signing.secretKeyRingFile=D\:\\key\\secring.gpg(生成的secring.gpg的位置)
ossrhUsername=Sonatype注冊的用戶名
ossrhPassword=Sonatype注冊的密碼
然后在Android Library Module的build.gradle尾部添如下代碼
apply from: "${rootProject.projectDir}/publish_aar.gradle"
然后同步(sync)一下;
3.上傳aar庫到mavenCentral
我們在Android Studio右側的gradle task視窗中,找到我們這個Android Library Module,然后找到該Module下的Tasks下的publishing任務,然后點擊該任務下的publishReleasePublicationToReleasesRepository;

任務執行完畢之后,后續步驟就和上傳jar庫中的后續步驟是一樣的,去Nexus Repository Manager上執行相應的close、release操作,然后等待2個小時,然后我們在https://search.maven.org/ 上就可以搜索到我們的這個庫了,我么可以通過groupId,或者通過庫名來搜索;然后就可以使用該aar庫了,gradle中使用方式同jar庫;
implementation 'io.github.maqing-programmer:mylibrary:2.0'
以上就是aar庫上傳至mavenCentral的程序;
注意:發布到MavenCentral上的庫是無法洗掉的,你也無法重新發布一個相同版本號的庫,你只能發布一個其他版本號的庫
文章內容參考:
發布Android庫到MavenCentral教程
Android庫發布到Maven Central全攻略
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/287637.html
標籤:其他
