將項(xiàng)目發(fā)布到Maven中央庫
前幾天參考@黃勇 大神的博客 http://my.oschina.net/huangyong/blog/226738 成功將我的Hutool項(xiàng)目發(fā)布到了Maven的中央庫,發(fā)表這篇博客以做紀(jì)念,順便重新整理步驟并說明一下在發(fā)布過程中遇到的一些原博客中沒有說明的問題。
其實(shí)總結(jié)下來發(fā)布的過程是與Sonatype工作人員交互的過程,這個(gè)過程是在Sonatype的JIRA平臺(tái)上完成的,過程如下:
- 注冊(cè)
- 提交一個(gè)issue(提出一個(gè)發(fā)布申請(qǐng)),告訴工作人員我要?jiǎng)?chuàng)建一個(gè)構(gòu)件。
- 等待工作人員審批,會(huì)給你發(fā)郵件,在這個(gè)issue下給你comment說明通過或者哪里有問題。
- 上傳構(gòu)件
- 發(fā)布構(gòu)建,并在哪個(gè)issue下告訴工作人員我發(fā)布了
- 等待審核,如果通過會(huì)告訴你需要release一下并在issue上告訴工作人員我release了
- 發(fā)布成功
這個(gè)過程比較漫長,慢在審核的過程,所以這個(gè)過程***在晚上進(jìn)行(我23點(diǎn)進(jìn)行的,過了幾分鐘就回復(fù)我了),等待也是焦急而激動(dòng)的,總體說來整個(gè)過程還是很有成就感滴~
1. 注冊(cè)帳戶
注冊(cè)地址是 https://issues.sonatype.org/secure/Signup!default.jspa
字段我就不細(xì)說了,一看就懂,不過Email非常重要,之后和工作人員的交流全靠這個(gè)郵件了。
2. 創(chuàng)建一個(gè) Issue
地址是 https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
這里需要特別說明的是Group Id,如果你是托管在Github或者Git@OSC 可以使用com.github.XXX或者net.oschina.XXX,我之前注冊(cè)了個(gè)自己的域名com.xiaoleilu,所以在此填寫這個(gè)group,剩下的可以依照實(shí)際情況填寫,例如托管的地址等等。
3. 等待Issue審批
審批過程中出現(xiàn)過一些問題,***次提交是因?yàn)槲业腉roup Id 不符合規(guī)范(我用的looly.github),工作人員給我修正為com.github.looly了,然后告訴我可以進(jìn)行下一步了,當(dāng)時(shí)沒理解,以為沒通過,結(jié)果我又重新提交了一個(gè)Issue(就是com.xiaoleilu的Group Id),然后工作人員確認(rèn)這個(gè)域名是否是我自己的,我回復(fù)是(在JIRA這個(gè)Issue下加個(gè)Comment),接著就通過了。
截圖為這個(gè)Issue的截圖,當(dāng)看到 Configuration has been prepared, now you can:
這句話的時(shí)候,說明你已經(jīng)通過了Issue的審批,可以上傳構(gòu)建了。
4. 使用 GPG 生成密鑰對(duì)
這個(gè)步驟是不是很突然?GPG是干嘛的?我開始也很迷茫,后來看官方文檔說是簽名構(gòu)建用的,貌似為了保證你的構(gòu)件不被第三方篡改,用于驗(yàn)證,神馬原理呢?就是用這個(gè)東西在本地生成一個(gè)公鑰和一個(gè)私鑰,把公鑰上傳上去,當(dāng)發(fā)布的時(shí)候用私鑰簽名一下(這個(gè)由maven-gpg-plugin搞定,不用我們自己來)。其實(shí)這個(gè)步驟也折騰了我好久,按照原博客的步驟,下載Gpg4win-Vanilla,我下載的2.1版本,系統(tǒng)是Windows8.1,并不能正常使用(在輸入密碼那段老是過不去),于是我轉(zhuǎn)向Cygwin,步驟如下:
-
安裝
我使用apt-cyg安裝的,具體不介紹了,如果不會(huì)就參考Windows下安裝Cygwin及包管理器apt-cyg,然后運(yùn)行- apt-cyg install gnupg
如果你是Linux,也可以用包管理工具安裝gnupg
這個(gè)包。
-
生成公鑰私鑰
- gpg --gen-key
一路回車,然后輸入用戶名、郵箱等,***重復(fù)兩次輸入Passphase(這個(gè)在發(fā)布的時(shí)候需要,在此牢記),如果你還是不清楚,看下這篇博客GPG入門教程
-
查看公鑰私鑰
- gpg --list-keys
- /home/loolly/.gnupg/pubring.gpg
- -------------------------------
- pub 2048R/C990D076 2014-05-28
- uid Looly <loolly@gmail.com>
- sub 2048R/48F6CC72 2014-05-28
其中 C990D076
是需要傳到服務(wù)器的
-
發(fā)布公鑰
- gpg --keyserver hkp://pool.sks-keyservers.net --send-keys C990D076
執(zhí)行這一步在Cygwin下可能會(huì)報(bào)錯(cuò)
- gpg: 警告:配置文件‘/home/loolly/.gnupg/gpg.conf’權(quán)限不安全
- gpg: 警告:配置文件‘/home/loolly/.gnupg/gpg.conf’的關(guān)閉目錄權(quán)限不安全
原因是.gnupg的權(quán)限太大,這個(gè)目錄必須只有當(dāng)前用戶本人有寫權(quán)限,所以執(zhí)行
- chmod 700 .gnupg
我開始的時(shí)候修改權(quán)限失敗了,原因是這個(gè)目錄的組是None
,所以執(zhí)行
- hown loolly:Users .gnupg
給定了一個(gè)組名,這樣chmod命令就可以正常執(zhí)行了。
-
查看是否成功
- gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys C990D076
好的,我們的密鑰對(duì)已經(jīng)準(zhǔn)備好了,至于如何使用,請(qǐng)看接下來的步驟。
5. 修改setting.xml
setting.xml
這個(gè)文件存在于兩個(gè)地方,一個(gè)是用戶的Maven配置文件,在${user}/.m2/setting.xml
,${user}
表示你的用戶目錄,這個(gè)文件只對(duì)當(dāng)前用戶有效,另一個(gè)在你Maven安裝目錄的conf/setting.xml文件,這個(gè)是全局的配置文件,考慮到我的電腦只有自己用,所以只用全局配置文件添加內(nèi)容如下:
- <settings>
- ...
- <servers>
- <server>
- <id>oss</id>
- <username>用戶名</username>
- <password>密碼</password>
- </server>
- </servers>
- ...
- </settings>
這里的用戶名密碼就是我們?cè)?**部注冊(cè)的時(shí)候的用戶名和密碼。
6. 修改pom.xml文件
pom.xml在Maven中央庫的審核比較嚴(yán)格,必須有固定的一些字段,還有發(fā)布的構(gòu)件必須包含字節(jié)碼jar、源碼jar、文檔jar,這些都可以通過maven插件搞定,具體這個(gè)文件我就不貼了,請(qǐng)查看我的pom做參考:
https://github.com/looly/hutool/blob/master/pom.xml
其中必須字段是:
- name
- description
- url
- licenses
- developers
- scm
這里我按照原博客的方法,把發(fā)布限制在了一個(gè)profile里(Profile理解為一個(gè)構(gòu)建行為的配置,每種行為對(duì)應(yīng)一個(gè)profile,例如線上、測試的某些配置不同,就可以分為不同的profile執(zhí)行,如果你還不明白就自行百度吧~),發(fā)布需要的source插件、javadoc插件、gpg插件都在這個(gè)profile里,這樣只有在發(fā)布的時(shí)候才會(huì)生成源碼包、文檔API包和做gpg簽名。distributionManagement
則是定義了release
和snapshot
發(fā)布的地址,這個(gè)在Issue通過審核后工作人員會(huì)給你,還有就是snapshotRepository
與 repository
中的 id
一定要與 setting.xml
中 server
的 id
保持一致。
7. 發(fā)布到OSS
這一步主要是生成相應(yīng)的一些jar包和簽名文件,并上傳到OSS的服務(wù)器,命令也比較簡單
- mvn clean deploy -P release -Dgpg.passphrase=你的Passphase
這一步特別說明下,按照原博主的說法,執(zhí)行mvn clean deploy -P release
會(huì)自動(dòng)彈出一個(gè)對(duì)話框,我這里沒有彈出來……而且報(bào)簽名異常,后來百度之,得加上-Dgpg.passphrase=你的Passphase
這個(gè)參數(shù),用你自己的Passphase,就可以成功了(我嚴(yán)重懷疑Cygwin的問題……)還有-P參數(shù)表示使用的profile名,就是profile下 release 這個(gè)標(biāo)簽的內(nèi)容。
8. 發(fā)布構(gòu)建
進(jìn)入https://oss.sonatype.org并登陸,會(huì)在左側(cè)有個(gè)staging Repositories
點(diǎn)擊進(jìn)入,在右側(cè)面板找到你的構(gòu)件,狀態(tài)應(yīng)該是open,你要將其置為closed,點(diǎn)擊上方的close
按鈕即可(這個(gè)按鈕我找了10分鐘我會(huì)明說么::>_<:: )。
接下來系統(tǒng)會(huì)自動(dòng)驗(yàn)證有效性,如果你的Group Id和pom.xml沒有錯(cuò)誤,狀態(tài)會(huì)自動(dòng)變成closed,如果有問題,會(huì)在下面提示你那里有問題,加入有問題你可以點(diǎn)擊drop按鈕刪掉這個(gè)構(gòu)件,修改后重新執(zhí)行步驟7。
接下來你需要點(diǎn)擊release
按鈕發(fā)布你的構(gòu)件。
9. 在Issue中通知工作人員
然后回到JIRA中你的Issue,寫個(gè)comment,我寫的是Component has been successfully issued.
告訴工作人員我發(fā)布完成了,等待他們審核。審核通過后我們就可以在中央庫搜索到我們的構(gòu)件了!搜索的地址是:
10. 總結(jié)
當(dāng)可以搜索出來自己的構(gòu)件的那一刻實(shí)在抑制不住心中的激動(dòng),各種朋友圈去發(fā)截圖炫耀(雖然朋友圈里的同學(xué)都看不懂我截圖這玩意兒是干啥的……),有種公司在美國上市的趕腳有木有!沒辦法,屌絲只有這些追求,讓自己的代碼被更多的人使用,會(huì)感到非常有成就感。
PS.說下發(fā)布中的一些細(xì)節(jié),在執(zhí)行第8步的時(shí)候,我只是簡單的close,沒有release,結(jié)果工作人員發(fā)來郵件說"Almost done! Looks like you still need to release the staging repository”,然后我才點(diǎn)擊release,再加了個(gè)comment才發(fā)布成功。
令人欣慰的是總算完成了,感謝 @黃勇 。
原文鏈接:http://my.oschina.net/looly/blog/270767