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