在開始以前,先對
OSSRH
作下了解是很必要的,由於一開始,我並不知道這是個啥玩兒意。我想和我同樣的人應該仍是有不少的。
OSSRH
:Sonatype Open Source Software Repository Hosting Service
,爲開源軟件提供maven倉庫託管服務。你能夠在上面部署snapshot、release等,最後你能夠申請把你的release同步到Maven Central Repository
(Maven中央倉庫
)。html
我的的理解,OSSRH
是Maven中央倉庫
的前置審批倉庫,只有你徹底符合了發佈要求,成功的將你的項目發佈到了OSSRH
,纔有機會申請同步到Maven中央倉庫
。java
這篇主要是記錄這整個流程,方便之後本身查閱,同時能夠幫助到想作一樣事情的朋友。git
JIRA是Atlassian公司出品的項目與事務跟蹤工具,被普遍應用於缺陷跟蹤、客戶服務、需求收集、流程審批、任務跟蹤、項目跟蹤和敏捷管理等工做領域。
網址:https://issues.sonatype.org/github
無非就是填寫下注冊信息,沒有什麼特別的apache
能夠在頭部看到一個Create
的按鈕ubuntu
會彈出Create Issue
表單bash
Project
:選擇Community Support - Open Source Project Repository Hosting (OSSRH)
Issue Type
:選擇New Project
Summary
:寫個標題作個簡單概述你要作啥。真不知道寫什麼,直接把項目名稱寫上就行,我就這麼幹了哈。Group Id
:服務器
本身有域名
可使用子域名做爲Group Id
。例:個人項目叫paladin2
,那麼就用org.zhangxiao.paladin2
做爲Group Id
網絡
注意:不能瞎編一個,由於後面審覈人員會來審覈你是不是該域名的擁有者
michaelzx
,那麼就用com.github.michaelzx.paladin2
做爲做爲Group Id
Project URL
:要與Group Id
必定關聯性app
Project URL
=http://paladin2.zhangxiao.org
Group Id
=org.zhangxiao.paladin2
Project URL
=https://github.com/michaelzx/Paladin2
Group Id
=com.github.michaelzx.paladin
SCM url
:版本倉庫的拉取地址若是有問題,老外在評論中把問題給你指出來,能夠在原有的issue把資料改正確
我以前是犯了個低級的錯誤把Group Id
寫成了域名
審覈人員要處理的issue不少,你可能要耐心等待一會,不要急
我以前急了,就從新提交了2個新的issue,最後管理員仍是耐心的把重複的issue關閉
若是一切順利,那麼你會收到審覈人員,這樣的一個評論:
爲了確保中央存儲庫中可用組件的質量水平,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
Javadoc
和Sources
是必須的,後面會說到用Gradle的一些插件來生成asc
文件,這是GPG
簽名文件,能夠用於校驗文件說明:後續過程均在OSX
環境下
OSX
下能夠經過brew來安裝gpg
命令行工具
$ brew update $ brew install -v gpg
你會發現從brew
的gpg
命令行工具,作了國際化支持,連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
,這個叫作密鑰指紋
(應該是用來作惟一識別)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會去拉取的公鑰服務器列表
keys.gnupg.net pool.sks-keyservers.net keyserver.ubuntu.com
爲何我要特地列出來?
由於有些文章或教程裏面,都僅給出了一個服務器,如pool.sks-keyservers.net
可是,我在實際操做有時候由於網絡緣由,並非總能成功上傳。
因此,若是把公鑰上傳到keyserver.ubuntu.com
也是OK的。
key id
password
KeyRingFile
準備好了以上幾項,咱們就能夠開始擼Gradle了
有些文章說,最好是先生成一個吊銷憑證備用,暫時不知道什麼場景下會用到
主要依賴於兩個插件:
signing
:https://docs.gradle.org/4.10.... maven-publish
:https://docs.gradle.org/4.10.... 修改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'
首先,用Gradle執行publishToMavenLocal
任務,先在本地發佈下,看看生成了哪些文件,或還有什麼問題
而後,用Gradle執行publish
任務,發佈到指定的maven倉庫
若是沒有報錯,那麼恭喜你,已經成功提交到了sonatype的倉庫中
可是提交成功,並不表明發佈成功
用你以前註冊的帳號密碼,登陸:https://oss.sonatype.org/
登陸後查看左側的Build Promotion
->Staging Repositories
你的提交,會出如今最下面
,至於其餘是啥,我也不太清楚😂
你的提交在未處理前,是open
狀態,而後點擊Close
按鈕。
一開始不太明白這個Close
是啥意思,後來看了下,主要按照中央倉庫的要求來驗證下你上傳到文件
簽名就是其中一個步驟,會去公鑰服務器拉取公鑰,而後來驗證你全部的文件
須要等待一會,等它執行完畢,狀態會從open
變成closed
若是碰到錯誤的話,仔細看下
Activity
選項卡,執行了什麼步驟,那個步驟出現了什麼錯誤,很清晰的
通常狀況下,感受若是順利close
後,再次選中點擊Release
,耐心等待一會,就大功告成了!
能夠在側邊欄Artifact Search
中搜索下你的groupId
,此時應該能看到對應的構件名稱和版本了
可是很抱歉,到此爲止,你的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/...