【記錄】2021使用gradle發(fā)布到mavenCentral

背景:之前自己弄的一些基礎(chǔ)庫(kù),示例代碼 都是在github托管,個(gè)別會(huì)發(fā)布到j(luò)center上窝稿,最近看打開(kāi)github 實(shí)在是太慢了就 想著遷移到 碼云 上托管吧,同時(shí)也該 重新搞搞自己的基礎(chǔ)庫(kù)凿掂,方便快速寫demo伴榔,同時(shí)發(fā)布到mavenCentral 上 (因?yàn)閖center 不維護(hù)了)

發(fā)布過(guò)程記錄如下:(參考: Android庫(kù)發(fā)布到Maven Central全攻略發(fā)布Android庫(kù)到MavenCentral教程
基本按上面的參考文章去做就好庄萎,只不過(guò)有些點(diǎn)踪少,文章沒(méi)提到,或者時(shí)間隔得久了糠涛,某些步驟有變

一援奢、注冊(cè)
1、Maven Central是由sonatype運(yùn)營(yíng)的忍捡,https://issues.sonatype.org注冊(cè)賬號(hào)
2集漾、創(chuàng)建問(wèn)題,按上面的文章進(jìn)行操作就好锉罐,直到問(wèn)題狀態(tài)為關(guān)閉狀態(tài)

image.png

期間的交流如下
image.png

image.png

二帆竹、創(chuàng)建GPG秘鑰
1、因?yàn)間radle 上傳 的時(shí)候用到脓规,我們就先來(lái)創(chuàng)建GPG秘鑰好了栽连,我是只用了命令行去操作的,gpg --full-gen-key
2、加密方式選擇RSA and RSA秒紧,長(zhǎng)度輸入4096绢陌,過(guò)期時(shí)間直接回車不用管,然后輸入一個(gè)user ID并且提供一個(gè)郵箱熔恢,我直接用的我sonatype的用戶名和郵箱脐湾。最后一步輸入'O',表示OK
3叙淌、之后會(huì)彈出一個(gè)對(duì)話框秤掌,讓輸入密碼。后面gradle用到
image.png

三鹰霍、Gradle準(zhǔn)備

//publish-mavencentral.gradle
apply plugin: 'maven-publish'
apply plugin: 'signing'

task androidSourcesJar(type: Jar) {
    archiveClassifier.set("sources")
    from android.sourceSets.main.java.source

    exclude "**/R.class"
    exclude "**/BuildConfig.class"
}

Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream() ;
properties.load( inputStream )

ext {
    PUBLISH_GROUP_ID = 'com.gitee.zaiqiang231'
    PUBLISH_ARTIFACT_ID = 'base-lib'
    PUBLISH_VERSION = '1.1.5'
}

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 PUBLISH_GROUP_ID
            artifactId PUBLISH_ARTIFACT_ID
            version PUBLISH_VERSION

            // 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 = 'base lib'
                // If your project has a dedicated site, use its URL here
                url = 'https://gitee.com/zaiqiang231'
                licenses {
                    license {
                        //協(xié)議類型闻鉴,一般默認(rèn)Apache License2.0的話不用改:
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id = 'zaiqiang'
                        name = 'zaiqiang'
                        email = '461804160@qq.com'
                    }
                }
                // Version control info, if you're using GitHub, follow the format as seen here
                scm {
                    //修改成你的Git地址:
                    connection = 'scm:git:gitee.com/zaiqiang231/BaseLib.git'
                    developerConnection = 'scm:git:ssh://gitee.com/zaiqiang231/BaseLib.git'
                    //分支地址:
                    url = 'https://gitee.com/zaiqiang231/BaseLib/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 {
                        println "--- dependency ${it.group} ${it.name} ${it.version}"
                        if(it.group != null && it.group.length() > 0){
                            println "添加 dependency ${it.group} ${it.name} ${it.version}"
                            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 = "baselib"

            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
}
//local.properties
signing.keyId=剛才獲取的秘鑰后8位,gpg --list-keys茂洒∶系海可以查看剛剛建立的密鑰
signing.password=秘鑰密碼
signing.secretKeyRingFile=/Users/wuyanqiang/secring.gpg
ossrhUsername=賬號(hào)
ossrhPassword=密碼

四、上傳
1督勺、上傳 gpg (這一步應(yīng)該是 要的渠羞,一開(kāi)始gradle 和這個(gè)key 沒(méi)有上傳總是報(bào) 403 拒絕,后面上傳完這個(gè)key 和 改了上面gradle里面的地址就成功了智哀,我也不糾結(jié)了次询,主要是這個(gè)上傳key 找了幾個(gè)文章才解決了)命令操作如下:
上傳gpg http://www.reibang.com/p/c898c9082872

wuyanqiangdeMacBook-Pro:~ wuyanqiang$ gpg --keyserver keys.gnupg.net --send-keys DBCC9EBB38B960432204AC3E1617D07237F53108

gpg: sending key 1617D07237F53108 to hkp://hkps.pool.sks-keyservers.net

wuyanqiangdeMacBook-Pro:~ wuyanqiang$ gpg --keyserver keyserver.ubuntu.com --send-keys DBCC9EBB38B960432204AC3E1617D07237F53108

gpg: sending key 1617D07237F53108 to hkp://keyserver.ubuntu.com

2、gradle 上傳操作:
任務(wù):assemble
任務(wù):publishReleasePublicationToBaselibRepository
執(zhí)行完畢后盏触,進(jìn)入https://oss.sonatype.org/ 渗蟹,使用你的sonatype帳號(hào)和密碼登錄。
進(jìn)入左側(cè)的Staging Repositories 就能看到你上傳的東西了

3赞辩、先close, 再release授艰。就算是發(fā)布成功了辨嗽,第一次發(fā)布,回到之前建立的jira issue 回復(fù)一下淮腾,應(yīng)該就能加快同步了

到此 所有操作完畢

更新:
補(bǔ)充遇到的一個(gè)問(wèn)題:發(fā)布后糟需,依賴已發(fā)布的庫(kù),發(fā)現(xiàn)庫(kù)內(nèi)的子依賴 沒(méi)有成功谷朝,遇到一個(gè) 依賴錯(cuò)誤


image.png

image.png

發(fā)現(xiàn)其中有個(gè)依賴 有問(wèn)題洲押,排查發(fā)現(xiàn)是 api fileTree(dir: 'libs', include: ['*.jar']) 導(dǎo)致的,遍歷依賴時(shí)會(huì)有一個(gè)空依賴, 在上面的gradle 追加一段 過(guò)濾

withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')

                    project.configurations.implementation.allDependencies.each {
                        println "--- dependency ${it.group} ${it.name} ${it.version}"
                        if(it.group != null && it.group.length() > 0){
                            println "添加 dependency ${it.group} ${it.name} ${it.version}"
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', it.group)
                            dependencyNode.appendNode('artifactId', it.name)
                            dependencyNode.appendNode('version', it.version)
                        }
                    }
                }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圆凰,一起剝皮案震驚了整個(gè)濱河市杈帐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖挑童,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件累铅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡站叼,警方通過(guò)查閱死者的電腦和手機(jī)娃兽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尽楔,“玉大人投储,你說(shuō)我怎么就攤上這事±觯” “怎么了轻要?”我有些...
    開(kāi)封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)垦缅。 經(jīng)常有香客問(wèn)我冲泥,道長(zhǎng),這世上最難降的妖魔是什么壁涎? 我笑而不...
    開(kāi)封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任凡恍,我火速辦了婚禮,結(jié)果婚禮上怔球,老公的妹妹穿的比我還像新娘嚼酝。我一直安慰自己,他們只是感情好竟坛,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布闽巩。 她就那樣靜靜地躺著,像睡著了一般担汤。 火紅的嫁衣襯著肌膚如雪涎跨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天崭歧,我揣著相機(jī)與錄音隅很,去河邊找鬼。 笑死率碾,一個(gè)胖子當(dāng)著我的面吹牛叔营,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播所宰,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绒尊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仔粥?” 一聲冷哼從身側(cè)響起婴谱,我...
    開(kāi)封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后勘究,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矮湘,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年口糕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缅阳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡景描,死狀恐怖十办,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情超棺,我是刑警寧澤向族,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站棠绘,受9級(jí)特大地震影響件相,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氧苍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一夜矗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧让虐,春花似錦紊撕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惭缰,卻和暖如春浪南,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背从媚。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工逞泄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拜效。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像各谚,于是被迫代替她去往敵國(guó)和親紧憾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容