使用Gradle發佈構件(Jar)到Maven中央倉庫

OSSRH

在開始以前,先對 OSSRH作下了解是很必要的,由於一開始,我並不知道這是個啥玩兒意。我想和我同樣的人應該仍是有不少的。

OSSRHSonatype Open Source Software Repository Hosting Service,爲開源軟件提供maven倉庫託管服務。你能夠在上面部署snapshot、release等,最後你能夠申請把你的release同步到Maven Central RepositoryMaven中央倉庫)。html

我的的理解,OSSRHMaven中央倉庫的前置審批倉庫,只有你徹底符合了發佈要求,成功的將你的項目發佈到了OSSRH,纔有機會申請同步到Maven中央倉庫java

這篇主要是記錄這整個流程,方便之後本身查閱,同時能夠幫助到想作一樣事情的朋友。git

一、註冊Sonatype JIRA帳號

JIRA是Atlassian公司出品的項目與事務跟蹤工具,被普遍應用於缺陷跟蹤、客戶服務、需求收集、流程審批、任務跟蹤、項目跟蹤和敏捷管理等工做領域。

網址:https://issues.sonatype.org/github

無非就是填寫下注冊信息,沒有什麼特別的apache

二、建立一個Issue

填寫資料

能夠在頭部看到一個Create的按鈕ubuntu

sonatype-create-issue-button

會彈出Create Issue表單bash

sonatype-create-issue-form

  • Project:選擇Community Support - Open Source Project Repository Hosting (OSSRH)
  • Issue Type:選擇New Project
  • Summary:寫個標題作個簡單概述你要作啥。真不知道寫什麼,直接把項目名稱寫上就行,我就這麼幹了哈。
  • Group Id服務器

    • 本身有域名
      可使用子域名做爲Group Id 。例:個人項目叫paladin2,那麼就用org.zhangxiao.paladin2做爲Group Id網絡

      注意:不能瞎編一個,由於後面審覈人員會來審覈你是不是該域名的擁有者
    • 本身沒域名
      能夠藉助github,例:個人用戶名爲michaelzx,那麼就用com.github.michaelzx.paladin2做爲做爲Group Id
  • Project URL:要與Group Id必定關聯性app

    • 例1:
      Project URL=http://paladin2.zhangxiao.org
      Group Id=org.zhangxiao.paladin2
    • 例2:
      Project URL=https://github.com/michaelzx/Paladin2
      Group Id=com.github.michaelzx.paladin
  • SCM url:版本倉庫的拉取地址

等待回覆

若是有問題,老外在評論中把問題給你指出來,能夠在原有的issue把資料改正確

我以前是犯了個低級的錯誤把 Group Id寫成了域名
審覈人員要處理的issue不少,你可能要耐心等待一會,不要急
我以前急了,就從新提交了2個新的issue,最後管理員仍是耐心的把重複的issue關閉

若是一切順利,那麼你會收到審覈人員,這樣的一個評論:

sonatype-create-issue-success

三、準備工做

文件要求

爲了確保中央存儲庫中可用組件的質量水平,OSSRH對提交的文件有明確的要求。

一個基礎的提交,應該包含一下文件:

example-application-1.4.7.pom
example-application-1.4.7.pom.asc
example-application-1.4.7.jar
example-application-1.4.7.jar.asc
example-application-1.4.7-sources.jar
example-application-1.4.7-sources.jar.asc
example-application-1.4.7-javadoc.jar
example-application-1.4.7-javadoc.jar.asc
  • 除了jar包和pom文件,JavadocSources是必須的,後面會說到用Gradle的一些插件來生成
  • 每一個文件都有一個對應的asc文件,這是GPG簽名文件,能夠用於校驗文件

GPG

安裝

說明:後續過程均在OSX環境下

OSX下能夠經過brew來安裝gpg命令行工具

$ brew update
$ brew install -v gpg

你會發現從brewgpg命令行工具,作了國際化支持,連help都是中文,贊👍

另外推薦一個工具 GPG Suite傳送門
在OSX提供了一個圖形化界面,把GPG做爲鑰匙串來作管理,蠻有意思,不過感受缺失點功能

Windows下
能夠安裝gpg4win,網址:傳送門
頁面最上面有個很大的下載按鈕,點了之後,貌似會讓你捐個款啥的……
不過你能夠往下看,有全部版本的列表地址,能夠跳過捐款,在祭上一個傳送門
人家只是隱藏的好了一些而已,仍是免費的。裝完了之後,在命令行中也能夠用gpg了

公鑰、私鑰、簽名

GPG的默認祕鑰類型是RSA,這裏涉及涉及幾個概念公鑰(public-key)、私鑰(secret-key)、簽名(sign/signature)

  • 公鑰私鑰是成對
  • 公鑰加密,私鑰解密。
  • 私鑰簽名,公鑰驗證。

新建一個密鑰

生成了密鑰之後,才能導出公鑰、私鑰

$ gpg --generate-key

建立的時候,會讓你輸入密碼,別輸了之後忘記了,後面gradle插件中會用到。

查看已經生成的密鑰

$ gpg -k
---------------------------------
pub   rsa2048 2019-01-25 [SC] [有效至:2021-01-24]
      72963F6B33D962380B1DC4BD8C446B86DF855F85
uid           [ 絕對 ] zhangxiao'paladin2 <mail@zhangxiao.org>
sub   rsa2048 2019-01-25 [E] [有效至:2021-01-24]
  • 72963F6B33D962380B1DC4BD8C446B86DF855F85,這個叫作密鑰指紋(應該是用來作惟一識別)
  • 後面8位DF855F85,叫作標識KEY ID,在後面須要加到Gradle插件配置中

導出私鑰文件

不少英文文檔或文章中常常出現KeyRingFile這個詞,這個究竟是啥?

https://users.ece.cmu.edu/~ad...
Keys are stored in encrypted form. PGP stores the keys in two files on your hard disk; one for public keys and one for private keys. These files are called keyrings. As you use PGP, you will typically add the public keys of your recipients to your public keyring. Your private keys are stored on your private keyring. If you lose your private keyring, you will be unable to decrypt any information encrypted to keys on that ring.
$ gpg --export-secret-keys [密鑰指紋] > secret.gpg

以上命令就能夠生成一個二進制的私鑰文件,後面須要配置到gradle中,讓插件幫咱們給文件批量簽名

加上 -a會生成一個用ASCII 字符封裝的 文本文件,方便複製,不過咱們這裏不須要

上傳公鑰到公鑰服務器

$ gpg --keyserver keyserver.ubuntu.com --send-keys [密鑰指紋]

在sonatype的倉庫提交後,會須要一個校驗步驟
會須要從多個公鑰服務器上下載匹配的公鑰,而後來校驗你上傳的文件的簽名

sonatype-gpg-signature-validation

簡單的說,你用來簽名的私鑰和你上傳的公鑰,必需要一對,這樣才能經過校驗

如下是sonatype會去拉取的公鑰服務器列表

keys.gnupg.net
pool.sks-keyservers.net
keyserver.ubuntu.com
爲何我要特地列出來?
由於有些文章或教程裏面,都僅給出了一個服務器,如 pool.sks-keyservers.net
可是,我在實際操做有時候由於網絡緣由,並非總能成功上傳。
因此,若是把公鑰上傳到 keyserver.ubuntu.com也是OK的。

總結

  1. 密鑰的key id
  2. 密鑰的password
  3. 私鑰的KeyRingFile
  4. 公鑰上傳到了公鑰服務器

準備好了以上幾項,咱們就能夠開始擼Gradle了

有些文章說,最好是先生成一個吊銷憑證備用,暫時不知道什麼場景下會用到

四、配置Gradle插件

主要依賴於兩個插件:

常規配置

修改build.gradle

// ... 在最下面新增如下代碼

apply plugin: 'maven-publish'
apply plugin: 'signing'

task sourcesJar(type: Jar) {
    from sourceSets.main.allJava
    classifier = 'sources'
}

task javadocJar(type: Jar) {
    from javadoc
    classifier = 'javadoc'
}


publishing {
    // 定義發佈什麼
    publications {
        mavenJava(MavenPublication) {
            // groupId = project.group
            // artifactId = project.name
            // version = project.version
            // groupId,artifactId,version,若是不定義,則會按照以上默認值執行
            from components.java
            artifact sourcesJar
            artifact javadocJar
            pom {
                // 構件名稱
                // 區別於artifactId,能夠理解爲artifactName
                name = 'Paladin2 Common'
                // 構件描述
                description = 'Paladin2 Common library'
                // 構件主頁
                url = 'https://paladin2.zhangxiao.org'
                // 許可證名稱和地址
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                // 開發者信息
                developers {
                    developer {
                        name = '聽風.Michael'
                        email = 'mail@zhangxiao.org'
                    }
                }
                // 版本控制倉庫地址
                scm {
                    url = 'https://github.com/michaelzx/Paladin2'
                    connection = 'scm:git:git://github.com/michaelzx/Paladin2.git'
                    developerConnection = 'scm:git:ssh://git@github.com:michaelzx/Paladin2.git'
                }
            }
        }
    }
    // 定義發佈到哪裏
    repositories {
        maven {
            url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
            credentials {
                // 這裏就是以前在issues.sonatype.org註冊的帳號
                username sonatypeUsername
                password sonatypePassword
            }
        }
    }
}

signing {
    sign publishing.publications.mavenJava
}


javadoc {
    // <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    // 防止本地打開中文亂碼
    options.addStringOption("charset", "UTF-8")
}

在工程根目錄下新增gradle.properties

signing.keyId=密鑰keyId
signing.password=密鑰password
signing.secretKeyRingFile=私鑰keyRingFile路徑

sonatypeUsername=sonatype帳號
sonatypePassword=sonatype密碼

保護敏感信息

以上方式,基本是按照gradle文檔的例子寫的。
可是假如你的工程是提交到非私有倉庫,那麼Sonatype的帳號信息和GPG的信息,就這樣暴露的話,彷佛不是那麼科學。因此,咱們須要換個方式來加載這些properties。

刪除剛纔的gradle.properties,新建一個publish.gradle文件,放到一個不會被提交到倉庫的位置(記得作好備份)。

ext.'signing.keyId' = '密鑰keyId'
ext.'signing.password' = '密鑰password'
ext.'signing.secretKeyRingFile' = '私鑰keyRingFile路徑'

ext.'sonatypeUsername'='sonatype帳號'
ext.'sonatypePassword'='sonatype密碼'

build.gradle最上面加上一行:

apply from: 'path/publish.gradle'
爲了方便,我是直接放在了工程根目錄的 .gradle目錄下
apply from: rootDir.canonicalPath + '/.gradle/publish.gradle'

五、提交到Sonatype倉庫

首先,用Gradle執行publishToMavenLocal任務,先在本地發佈下,看看生成了哪些文件,或還有什麼問題

而後,用Gradle執行publish任務,發佈到指定的maven倉庫

若是沒有報錯,那麼恭喜你,已經成功提交到了sonatype的倉庫中

可是提交成功,並不表明發佈成功

六、到Sonatype OSS發佈

用你以前註冊的帳號密碼,登陸:https://oss.sonatype.org/

登陸後查看左側的Build Promotion->Staging Repositories

你的提交,會出如今最下面,至於其餘是啥,我也不太清楚😂

sonatype-staging-repository-close

Close

你的提交在未處理前,是open狀態,而後點擊Close按鈕。

一開始不太明白這個 Close是啥意思,後來看了下,主要按照中央倉庫的要求來驗證下你上傳到文件
簽名就是其中一個步驟,會去公鑰服務器拉取公鑰,而後來驗證你全部的文件

須要等待一會,等它執行完畢,狀態會從open變成closed

若是碰到錯誤的話,仔細看下 Activity選項卡,執行了什麼步驟,那個步驟出現了什麼錯誤,很清晰的

Release

通常狀況下,感受若是順利close後,再次選中點擊Release,耐心等待一會,就大功告成了!

能夠在側邊欄Artifact Search中搜索下你的groupId,此時應該能看到對應的構件名稱和版本了

七、回覆Issue

可是很抱歉,到此爲止,你的jar包,還不會同步到maven倉庫中

你須要在你原先建立issue中,告訴下管理人員,你已經完成了第一次發佈

我用我蹩腳的英文,回覆以下:

I have already completed the first release.

而後管理人員給我回復了:

Central sync is activated for org.zhangxiao.paladin2. After you successfully release, your component will be published to Central, typically within 10 minutes, though updates to search.maven.org can take up to two hours.

OK,至此,你的構建就會同步到Maven Central Repository了。

八、同步須要多久

可能你會像我同樣很着急,啥時候能夠用,怎麼還搜不到呢~。~
從sonatype同步到中央倉庫,的確是須要必定的時間

不過根據個人觀察,文件的同步,會早於索引的同步

好比,好比你等了半天,而後 https://search.maven.org/ 上搜一下依然搜不到
那麼,你能夠去 https://repo1.maven.org/maven2/ 上按照座標找下,是否能找到你的包

若是能找到,那你就能夠開始引用它了

九、新版本更新

只要完成第一個發佈,後續就不須要再建立issue了,只要重複5-6步驟能夠了。

你能夠在groupId範圍內發佈任意名稱的構件

結束語

之前在NPM倉庫中發佈過本身的東西。相比之下,Maven倉庫的發佈流程,讓人感受嚴謹不少。

趕忙一塊兒在Maven全球中央倉庫中,留下你本身專屬的印記吧!

必定會讓你感受棒棒的^_^

參考文章

https://central.sonatype.org/...

原文地址

https://github.com/michaelzx/...

相關文章
相關標籤/搜索