摘要
Maven 中央倉庫并不支援直接上傳 jar 包,是以需要将 jar 包釋出到一些指定的第三方 Maven 倉庫,比如:Sonatype OSSRH 倉庫,然後該倉庫再将 jar 包同步到 Maven ,本文詳細記錄整個釋出、同步過程。
注冊一個 Sonatype 使用者
進入位址:issues.sonatype.org/secure/Sign… 注冊 Sonatype 使用者,Sonatype 通過 JIRA(JIRA 是 Atlassian 公司出品的項目與事務跟蹤工具)來管理 OSSRH 倉庫。
建立一個釋出構件的 issue
送出「構件釋出申請」的第一步是在 JIRA Dashborad 上建立一個 issue。如下所示,點選 Create 按鈕:
會彈出一個對話框讓你填寫 issue 的詳細資訊,這裡最重要的就是 Group Id,一般會帶上域名,千萬别弄錯了,這關系到以後釋出其它的構件。我們這裡是com.vesoft。
Sonatype 有域名驗證,驗證方式:
- 往你的 DNS 中添加 JIRA 編号記錄
- 重定向到你的 Github 首頁
如果你沒有域名,可參考這個連結:central.sonatype.org/pages/choos… 的方法進行操作
- 選擇一個帶有項目托管資訊的 GroupId,例如 io.github.facebook 或 com.github.facebook
- 另外一種推薦的方式是使用免費的 free managed security reporting service 将 hackerone.com/central-sec… 作為你項目的安全資訊保障 url,剩下的事情 Sonatype 從業人員會自行搞定。
等待 issue 稽核通過
稽核因為時差原因需要一定時間,稽核通過後會收到郵件通知,同時在對應 issue 下會看到 Sonatype 從業人員的回複,一般是添加一個 comment,内容大緻如下:
Configuration has been prepared, now you can: Deploy snapshot artifacts into repository oss.sonatype.org/content/rep… Deploy release artifacts into the staging repository oss.sonatype.org/service/loc… deploy/maven2 Promote staged artifacts into repository 'Releases' Download snapshot and release artifacts from group oss.sonatype.org/content/gro… Download snapshot, release and staged artifacts from staging group oss.sonatype.org/content/gro… please comment on this ticket when you promoted your first release, thanks
使用 GPG 生成密鑰對
生成密鑰對
> gpg --gen-key
會讓選擇加密方式:
- RSA and RSA (default)
- DSA and Elgamal
- DSA (sign only)
- RSA (sign only)
預設選第一個,選擇之後,需輸入使用者名和郵箱,和 Passphase——相當于密鑰庫密碼。
檢視公鑰
> gpg --list-keysxxx/.gnupg/pubring.gpg---------------------------------pub 2048R/xxxx 2019-12-02uid $YOUR_UID sub 2048R/**** 2019-12-02
這裡的公鑰 ID 是 xxxx,馬上就會用到了。
将公鑰上傳到 PGP 密鑰伺服器
gpg --keyserver hkp://keys.gnupg.net:11371 --send-keys xxxx
檢視公鑰是否上傳成功
> gpg --keyserver hkp://keys.gnupg.net:11371 --recv-keys xxxxgpg: 下載下傳密鑰‘xxxx’,從 hkp 伺服器 keys.gnupg.netgpg: 密鑰 xxxx:“$YOUR_UID ”未改變gpg: 合計被處理的數量:1gpg: 未改變:1
NOTE:
- 根據實際填寫此處的公鑰 ID
- 很多網上教程給的是 pool.sks-keyservers.net,個人感覺 pool.sks-keyservers.net 這個 keyserver 不好用,上傳了 key,經常會驗證失敗,也擷取失敗,maven 支援兩個 key servers keys.gnupg.net:11371 和 pool.sks-keyservers.net:11371
- 此處采用 hkp 協定而不是 http 協定
- 很多教程沒有給端口,經試驗,需加上端口号
本地的私鑰用來對上傳的構件進行數字簽名,而下載下傳該構件的使用者可通過上傳的公鑰來驗證簽名--需驗證這個構件是否由本人上傳的,因為存在構件被篡改的可能。
修改 Maven 配置檔案
修改 Maven 配置檔案主要是需要修改 setting.xml 和項目的 pom.xml 檔案
配置 Maven 的 setting.xml
修改 ~/.m2/setting.xml 檔案
... snapshots$USER_NAME$YOUR_PASSWORDrelease$USER_NAME$YOUR_PASSWORD
替換 USER_NAME , YOUR_PASSWORD 為 Sonatype 上面注冊的使用者名和密碼, 這裡的 ID 會在 pom.xml 裡面使用到。
配置 Maven 的 pom.xml
... nebula-javaNebula Java Clienthttps://github.com/vesoft-inc/nebula-javascm:git:https://github.com/vesoft-inc/nebulahttps://github.com/vesoft-inc/nebulascm:git:https://github.com/vesoft-inc/nebulaApache License, Version 2.0https://www.apache.org/licenses/LICENSE-2.0.txtrepolicense ... releaseorg.apache.maven.plugins maven-source-plugin attach-sourcesjarorg.apache.maven.plugins maven-javadoc-plugin 3.1.1com.facebook.thrift:com.facebook.thrift.*attach-javadocspackagejarnoneorg.apache.maven.plugins maven-gpg-plugin 1.6verifysignreleasehttps://oss.sonatype.org/service/local/staging/deploy/maven2/snapshotshttps://oss.sonatype.org/content/repositories/snapshots/ ...
- pom.xml 中必須包括: name 、 description 、 url 、 licenses 、 developers 、 scm 等基本資訊 (血淚史之踩過的坑)
- 釋出 maven 除了 jar 必須還有文檔包和源碼包。是以 pom 需添加 maven-javadoc-plugin 和 maven-source-plugin 。 參考示例:
com-vesoft-client|-- pom.xml|-- src`-- target `-- attach-source-javadoc-1.0-SNAPSHOT.jar `-- attach-source-javadoc-1.0-SNAPSHOT-javadoc.jar `-- attach-source-javadoc-1.0-SNAPSHOT-sources.jar
- 釋出建構需要秘鑰加密,是以 pom 需添加 maven-gpg-plugin (血淚史之踩過的坑)
多子產品項目配置
nebula-java 是多子產品項目
clientexamples
為了上傳 Client,需要上傳 parent 的 pom.xml,否則 Client 會找不到依賴(血淚史之踩過的坑),但我們又不希望上傳 examples 子產品,故做了如下改動:
- 項目資訊 name 、 description 、 url 、 licenses 、 developers 、 scm 等資訊和 maven-gpg-plugin 放在 parent 的 pom.xml 檔案中
... nebula-javaNebula Java Clienthttps://github.com/vesoft-inc/nebula-javascm:git:https://github.com/vesoft-inc/nebulahttps://github.com/vesoft-inc/nebulascm:git:https://github.com/vesoft-inc/nebulaApache License, Version 2.0https://www.apache.org/licenses/LICENSE-2.0.txtrepolicense$ID$NAME$EMAILvesoftarchitectdeveloperreleasehttps://oss.sonatype.org/service/local/staging/deploy/maven2/snapshotshttps://oss.sonatype.org/content/repositories/snapshots/org.apache.maven.plugins maven-gpg-plugin 1.6verifysign
- 在 Java Client 的 pom.xml 中添加 maven-javadoc-plugin 、 maven-source-plugin 和 maven-deploy-plugin
...... org.apache.maven.plugins maven-source-plugin attach-sourcesjarorg.apache.maven.plugins maven-javadoc-plugin 3.1.1com.facebook.thrift:com.facebook.thrift.*attach-javadocspackagejarnoneorg.apache.maven.plugins maven-deploy-plugin default-deploydeploy
在 example 子產品的 pom.xml 中聲明 skip deploy
...... org.apache.maven.plugins maven-deploy-plugin true
Q: 為什麼 maven-gpg-plugin 放在 parent 的 pom.xm l中,而 maven-javadoc-plugin,maven-source-plugin 插件放在 Client 的 pom.xml 中
A: 因為上傳的所有構件都需要加密,包括 parent 的 pom.xml,是以放在 parent 中; 而隻有 Client 需要上傳 javadoc,source,是以 maven-javadoc-plugin,maven-source-plugin 插件放在 Client 中。
上傳構件到 OSS 中
在 nebula-java/ 目錄下運作:
> mvn clean deploy -DpomFile=pom.xml
NOTE:不加 -DpomFile ,上傳的檔案中會沒有 parent 的 pom.xml (又是一部血淚史)
在 OSS 中釋出構件
使用 Sonatype 賬号登入 oss.sonatype.org/#stagingRep…,可在 Staging Repositories 中檢視已上傳的構件,這些構件目前是放在 Staging 倉庫中,可進行模糊查詢,定位到剛上傳的構件。
此時,該構件的狀态為 Open ,勾選它,然後點選 Close 按鈕。系統會自動驗證該構件是否滿足指定要求 (幸福的人隻有一種,不幸的人各有各的不幸,可能會遇到各種各樣的不符合要求,Good luck!ヾ(◍°∇°◍)ノ゙)
當驗證完畢後,狀态會變為 Closed 。
最後,點選 Release 按鈕來釋出該構件
頁面可能要重新整理一下才能看到最新的狀态。
通知 Sonatype 構件已成功釋出
在前面 JIRA 的 issue 下面回複一條“構件已成功釋出”的評論,通知 Sonatype 的從業人員為要釋出的構件做審批,釋出後會關閉該 issue。
等待構件審批通過
然後,等待。。。
從中央倉庫中搜尋構件
大概十多分鐘後,可以在這裡 repo1.maven.org/maven2 找到剛剛釋出的構件,可以直接在 pom.xml 中使用啦~~
等同步完成大約 2 個小時,中央倉庫(連接配接:search.maven.org/)就可以搜到啦。
國内很多使用的是阿裡雲的鏡像,鏡像同步不是實時同步。為了及時使用,可以添加中央倉庫鏡像源,在 ~/.m2/setting.xml 檔案添加,如下:
...... nexus-mvncentralNexus Centralhttp://repo1.maven.org/maven2
第一次成功釋出之後,以後就不用這麼麻煩了,可以直接使用 Group Id 釋出構件。
後續操作
之後同一個 Group Id 的釋出流程
- 按照上文編輯 setting.xml 和 pom.xml,
- 上傳建構;
- 在 oss.sonatype.org/ close 并 release 構件;
- 等待同步完成(大約 2 小時)後,就可以使用了
最後溫馨提示:釋出的版本不支援修改,或者删除
星雲·小劇場
為什麼給圖資料庫取名 Nebula ? Nebula 是星雲的意思,很大嘛,也是漫威宇宙裡面漂亮的星雲小姐姐。對了,Nebula的發音是:[ˈnɛbjələ]
本文星雲圖講解--《阿爾普 188 和蝌蚪的尾巴》
為什麼這個星系有這麼長的尾巴?
在這張令人驚歎的遠景圖中,根據哈勃遺留檔案的圖像資料,遙遠的星系形成了一個引人注目的背景,這是被破壞的螺旋星系 Arp188,蝌蚪星系。
宇宙蝌蚪距離北方的龍星座(天龍座)隻有 4.2 億光年。它引人注目的尾巴大約有 28 萬光年長,以巨大、明亮的藍色星團為特征。有一個故事是這樣說的:一個更緻密的闖入星系從 Arp 188 前穿過——從右到左——被它們的引力甩在蝌蚪後面。在這次近距離接觸中,潮汐力将螺旋星系的恒星、氣體和塵埃拉出,形成了壯觀的尾巴。闖入者星系本身,估計位于蝌蚪後面 30 萬光年處,可以通過右上角的前景螺旋臂看到。與地球同名的蝌蚪星系很可能會随着年齡的增長而失去尾巴,尾巴上的星團形成了大螺旋星系的小衛星。
資料來源 | Hubble Legacy Archive, ESA, NASA;
圖檔來源 | Astronomy Picture of the Day | 2018 December 11