發(fā)布了一個jar包到中央倉庫,我的心好累…
哈嘍大家好啊,我是Hydra。
前幾天我在網(wǎng)上沖浪的時候,看見有一個老鐵在git上給我提了一個issue:
萬萬沒想到,有一天我寫的爛代碼居然也會被要求提到中央倉庫…
話再說回來,發(fā)布jar包到中央倉庫這個事,也不是我不想,而是真的不會??!
不過既然鐵子們都開口了,我這硬著頭皮也得上不是?那么從網(wǎng)上翻翻文檔,正式開搞。
Sonatype
首先第一步,我們需要在sonatype上注冊賬號并提交一個issue。
sonatype這個名字,突然一說大家可能有點(diǎn)反應(yīng)不過來,但是看完下面這張圖大家應(yīng)該就明白了:
沒錯,如果各位所在的公司有搭建自己的maven私服的話,那么一般用的就是sonatype公司開發(fā)的Nexus了。
這時候有小伙伴們估計(jì)就要問了,那么我要上傳中央倉庫和你sonatype又有什么關(guān)系?
這是因?yàn)閟onatype提供了一個服務(wù),英文全稱是Open Source Software Repository Hosting?,翻譯過來可以理解為開源軟件資源庫托管服務(wù),簡稱為OSSRH。
開發(fā)者在把自己的開源項(xiàng)目打成jar包后,可以免費(fèi)地將jar包托管在這里,這里先記住OSSRH這個簡稱,后面很多地方還會用到。
并且,maven中央倉庫是不允許我們直接上傳jar包到它上面的,因此我們只能將jar包發(fā)布到它指定的第三方maven倉庫,然后這個倉庫再將jar包同步到中央倉庫。而sonatype的OSSRH倉庫就是被認(rèn)可的第三方倉庫之一,所以我們選擇把jar包先發(fā)布到這上面來。
1、注冊
鋪墊了這么多,回過頭來注冊sonatype的賬號,注冊地址:
https://issues.sonatype.org/secure/Signup!default.jspa
注冊比較簡單,填一下郵箱、姓名、用戶名和密碼后,點(diǎn)擊sign up就完成了。
2、提交issue
登錄完成后,語言可以選擇中文,在system dashboard頁面中,點(diǎn)擊上方導(dǎo)航欄上的新建按鈕,就可以創(chuàng)建一個issue,我看也有地方把這個issue稱為工單。
要填的東西有點(diǎn)多,我們分兩頁看,先看第一頁:
- 項(xiàng)目:選擇Community Support - Open Source Project Repository Hosting (OSSRH)
- 問題類型:選擇New Project
- 概要:項(xiàng)目概要,這里填寫項(xiàng)目名稱就行,如果更嚴(yán)謹(jǐn)?shù)脑?,可以說明是要新發(fā)布一個包到maven
- 描述:非必填項(xiàng),這里簡單描述了一下項(xiàng)目的功能
填完這些后,接著填下面的內(nèi)容:
- Group Id?:項(xiàng)目的groupId?。如果以com?等開頭的話,之后會驗(yàn)證你對該域名的所有權(quán)。所比較簡單的做法是直接以io.github.?開頭,再加上你的github的用戶名,所以這里我填寫的是io.github.trunks2008
- Project URL?:項(xiàng)目地址,不帶.git結(jié)尾
- SCM url?:也是項(xiàng)目地址,不過最后要帶上.git
- Username(s):非必填項(xiàng),這里是能輔助你提交項(xiàng)目的合作人的帳號,前提是他也在這個JIRA注冊過賬號
- Already Synced to Central?:這里選擇No?,如果選Yes會關(guān)閉自動同步到中央倉庫
填寫完成后,點(diǎn)新建按鈕就完成了issue的提交。
3、創(chuàng)建臨時庫
創(chuàng)建完issue后等個幾分鐘,在它的活動日志區(qū)就會收到一條回復(fù):
大意就是,如果想要繼續(xù)流程的話,就按照下面兩步走。
首先,先到你的github賬戶下面,按照它指定的名稱,建這么一個臨時倉庫,證明你對這個github賬號的所有權(quán)。于是我麻利的在github建好了這個倉庫:
然后問題就來了,我們仔細(xì)看看回復(fù)中的第二步指南:
Edit this ticket and set Status to Open.
翻譯過來就是,編輯這個票據(jù)并把狀態(tài)設(shè)置為打開狀態(tài)。
可就是這么樸實(shí)無華且枯燥的一句話,把我給難住了。在這條消息回復(fù)里,我把所有能點(diǎn)的地方點(diǎn)了一遍,也沒找到這個所謂的ticket是什么東西。
當(dāng)我的鼠標(biāo)都要點(diǎn)爛了時,終于在別的老哥的提示下找到了答案,是要點(diǎn)擊這個issue中的這個毫不起眼的Respond按鈕啊!
說實(shí)話,在沒有人告訴我這是個按鈕之前,我一直以為這玩意就是一個破標(biāo)簽…
在我們把這個issue的狀態(tài)切換回Open后,過個幾分鐘,如果沒有其他問題,那么你就會收到下一條回復(fù):
收到這條消息,就說明我們的groupId已經(jīng)準(zhǔn)備好可以使用了,并且之后可以用當(dāng)前這個sonatype的賬號發(fā)布snapshot和release版本的jar包到它的oss倉庫中了。
接著看下面一段,根據(jù)構(gòu)建配置,第一個組件可能會在成功部署(deploy)后自動發(fā)布(release)。如果發(fā)生這種情況,那么我們會收到一條消息,來確認(rèn)我們的jar包被同步到了maven中央倉庫。
既然人家都 congratulation 了,那咱們也開心點(diǎn),到這里在sonatype上的操作就暫時告一段落了…
gpg秘鑰
接下來,我們需要使用gpg生成秘鑰,在后續(xù)包發(fā)布jar時會根據(jù)生成的秘鑰進(jìn)行校驗(yàn),因?yàn)閟onatype也需要對上傳這一行為進(jìn)行權(quán)健的校驗(yàn),避免無意義或惡意上傳文件的行為。
1、安裝gpg
官網(wǎng)下載地址:
https://www.gnupg.org/download/
window版下載地址:
https://files.gpg4win.org/gpg4win-4.0.4.exe
我在下載了window版的安裝文件后,一路無腦點(diǎn)擊下一步就可以完成安裝了。
2、創(chuàng)建秘鑰
在安裝完成gpg后,在命令行下通過指令來生成一個秘鑰:
在生成的過程中,首先會要求輸入姓名和郵箱地址,在命令行窗口下填完這兩個信息后,還會彈窗要求輸入一個密碼:
這個密碼非常重要,一定要記住,后面在項(xiàng)目deploy的時候還會用到。填完后繼續(xù),秘鑰就會成功生成并保存在本地目錄下了:
3、上傳秘鑰
在秘鑰生成完后,我們需要把公鑰上傳到公共服務(wù)器供sonatype驗(yàn)證,可以通過下面的命令將公鑰上傳:
在公鑰上傳成功后,還可以通過--recv-keys來驗(yàn)證公鑰:
雖然我這里一次就上傳成功了,但是在看其他教程的過程中,也可能會出現(xiàn)失敗的情況,這種情況可以嘗試上傳到其他的存放公鑰的服務(wù)器:
- pool.sks-keyservers.ne
- keys.openpgp.org
- pgp.mit.edu
端口的話都是11371,這些公鑰服務(wù)器間會同步它們的數(shù)據(jù)給其他服務(wù)器,所以只要上傳成功到其中一臺就行。
maven 設(shè)置
接下來需要修改本地maven的配置,為了保險起見,我建議大家最好同時修改.m2和conf目錄下的配置文件,否則有可能出現(xiàn)一些奇怪的問題。
1、server
首先在配置文件中添加一個server節(jié)點(diǎn),配置sonatype的用戶名及密碼:
2、profile
接著添加一個profie節(jié)點(diǎn),配置gpg信息,這里就需要填入在生成gpg秘鑰過程中,我們在彈窗中輸入的密碼了:
在修改完成后,可以在命令行窗口下,通過命令查看我們修改過的配置是否已經(jīng)生效了:
如果顯示的內(nèi)容和配置文件中的一樣,那么恭喜,后面就只還剩下億點(diǎn)點(diǎn)工作了。
項(xiàng)目pom修改
在maven環(huán)境修改完成后,我們還需要對項(xiàng)目的pom文件進(jìn)行一些修改。
1、基礎(chǔ)信息
如果我們之前的代碼中,groupId?和sonatype上注冊的不一致,那么需要修改項(xiàng)目的groupId?改為一致。既然都要發(fā)布了,順便也把version改為release版本吧。
2、distributionManagement
添加distributionManagement信息,聲明要打包到sonatype的maven倉庫中去。
3、plugins
這里需要添加各種plugin插件,除了常用的maven-compiler和maven-deploy插件外,還需要下面幾個關(guān)鍵插件:
- nexus-staging-maven-plugin: sonatype插件,用來將項(xiàng)目發(fā)布到中央倉庫使用
- maven-source-plugin:生成java source.jar文件
- maven-javadoc-plugin:生成java doc文檔
- maven-gpg-plugin:對文件進(jìn)行自動簽名
使用到的全部插件詳細(xì)配置如下,直接拷到項(xiàng)目中就可以使用:
至于在idea中,插件經(jīng)常下載失敗報紅線的問題,個人測試可以先把它們加到dependencies中拉取下來,成功率能高不少…
4、開源簽名證書
添加license信息,使用Apache Licene 2.0 協(xié)議就行。
5、倉庫信息
在這里填寫一下項(xiàng)目的地址,把我們的github倉庫地址貼上去就可以了。
6、開發(fā)人員信息
補(bǔ)充開發(fā)者的個人信息,雖然估計(jì)也沒什么人會聯(lián)系我就是了。
在添加完這么多茫茫的信息后,我的pom文件成功的從70行變成了200多行……
發(fā)布
到這里所有的基本工作就都做完了,下面執(zhí)行激動人心的deploy命令!
命令執(zhí)行結(jié)果:
果然是都到最后一步了,還是不能掉以輕心啊…
查了一下這個報錯,大概就是SSL的問題,修改一下deploy命令的參數(shù)就行~
再次執(zhí)行命令:
奇怪的錯誤又出現(xiàn)了…
這次的問題比較簡單,就是項(xiàng)目中的pom中缺失了一些項(xiàng)目信息,修改pom文件,添加下面的信息:
再次嘗試deploy,終于成功了!
登錄https://s01.oss.sonatype.org/,看一眼oss倉庫,我們的jar包已經(jīng)上傳成功了。
你以為到這里就結(jié)束了?恰恰相反,更加漫長的等待才剛剛開始…
漫長的等待
在項(xiàng)目deploy成功后,回到sonatype,活動日志區(qū)很快就會收到一條新消息:
大意就是sonatype到中央倉庫的同步是激活的,當(dāng)我們成功發(fā)布組件后,通常30分鐘左右就可以在 https://repo1.maven.org/maven2/?上訪問到了,但是更新到https://search.maven.org/可能需要4個小時。
按照這個提示,等半個小時再訪問repo1.maven.org,經(jīng)過一路搜索最后可以找到:
過四個小時再訪問search.maven.org,果然在上面也可以查找到我的jar包了,sonatype誠不我欺…
講道理的話,既然發(fā)布成功了,那我們就可以在項(xiàng)目中按照這個maven坐標(biāo)拉取到j(luò)ar包了,但是在項(xiàng)目中就是死活拉不下來…
于是我靈機(jī)一動,改為使用gradle:
你別說,居然真的成功了…
不過話說回來,在日常工作中,我還是更習(xí)慣用https://mvnrepository.com來查找maven依賴,至于什么時候能在上面搜到,我實(shí)測了一下,這個周期真是長的可怕。
在14號就上傳jar包成功后,直到17號才能在mvnrepository上查找到…
最后
那么,這次不那么順利的踩坑之旅到這里就基本上結(jié)束了,總的來說,發(fā)布jar包到中央倉庫真是個體力活。
在實(shí)際操作的過程中,有著數(shù)不完的坑,動不動一個點(diǎn)就可能卡住好幾個小時,即便成功發(fā)布了,后續(xù)還有漫長的等待時間,總之就是非常心累…
對于那位在git上給我提issue的兄弟,我只有一句話想說…
本文在sonatype上提交的issue,以及提交的項(xiàng)目git地址我都放在下面了,大家如果有需求的話,可以參考一下~
sonatype的issue地址:https://issues.sonatype.org/browse/OSSRH-86180
項(xiàng)目的github地址:https://github.com/trunks2008/ulquiorra-cache
官方文檔指南:https://central.sonatype.org/publish/publish-maven/