天天看點

idea maven打jar包_Dev 日志 | 如何将 jar 包釋出到 Maven 中央倉庫摘要注冊一個 Sonatype 使用者建立一個釋出構件的 issue等待 issue 稽核通過使用 GPG 生成密鑰對修改 Maven 配置檔案上傳構件到 OSS 中在 OSS 中釋出構件通知 Sonatype 構件已成功釋出等待構件審批通過從中央倉庫中搜尋構件後續操作星雲·小劇場

idea maven打jar包_Dev 日志 | 如何将 jar 包釋出到 Maven 中央倉庫摘要注冊一個 Sonatype 使用者建立一個釋出構件的 issue等待 issue 稽核通過使用 GPG 生成密鑰對修改 Maven 配置檔案上傳構件到 OSS 中在 OSS 中釋出構件通知 Sonatype 構件已成功釋出等待構件審批通過從中央倉庫中搜尋構件後續操作星雲·小劇場

摘要

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 按鈕:

idea maven打jar包_Dev 日志 | 如何将 jar 包釋出到 Maven 中央倉庫摘要注冊一個 Sonatype 使用者建立一個釋出構件的 issue等待 issue 稽核通過使用 GPG 生成密鑰對修改 Maven 配置檔案上傳構件到 OSS 中在 OSS 中釋出構件通知 Sonatype 構件已成功釋出等待構件審批通過從中央倉庫中搜尋構件後續操作星雲·小劇場

會彈出一個對話框讓你填寫 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 。

idea maven打jar包_Dev 日志 | 如何将 jar 包釋出到 Maven 中央倉庫摘要注冊一個 Sonatype 使用者建立一個釋出構件的 issue等待 issue 稽核通過使用 GPG 生成密鑰對修改 Maven 配置檔案上傳構件到 OSS 中在 OSS 中釋出構件通知 Sonatype 構件已成功釋出等待構件審批通過從中央倉庫中搜尋構件後續操作星雲·小劇場

最後,點選 Release 按鈕來釋出該構件

idea maven打jar包_Dev 日志 | 如何将 jar 包釋出到 Maven 中央倉庫摘要注冊一個 Sonatype 使用者建立一個釋出構件的 issue等待 issue 稽核通過使用 GPG 生成密鑰對修改 Maven 配置檔案上傳構件到 OSS 中在 OSS 中釋出構件通知 Sonatype 構件已成功釋出等待構件審批通過從中央倉庫中搜尋構件後續操作星雲·小劇場

頁面可能要重新整理一下才能看到最新的狀态。

通知 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 和蝌蚪的尾巴》

idea maven打jar包_Dev 日志 | 如何将 jar 包釋出到 Maven 中央倉庫摘要注冊一個 Sonatype 使用者建立一個釋出構件的 issue等待 issue 稽核通過使用 GPG 生成密鑰對修改 Maven 配置檔案上傳構件到 OSS 中在 OSS 中釋出構件通知 Sonatype 構件已成功釋出等待構件審批通過從中央倉庫中搜尋構件後續操作星雲·小劇場

為什麼這個星系有這麼長的尾巴?

在這張令人驚歎的遠景圖中,根據哈勃遺留檔案的圖像資料,遙遠的星系形成了一個引人注目的背景,這是被破壞的螺旋星系 Arp188,蝌蚪星系。

宇宙蝌蚪距離北方的龍星座(天龍座)隻有 4.2 億光年。它引人注目的尾巴大約有 28 萬光年長,以巨大、明亮的藍色星團為特征。有一個故事是這樣說的:一個更緻密的闖入星系從 Arp 188 前穿過——從右到左——被它們的引力甩在蝌蚪後面。在這次近距離接觸中,潮汐力将螺旋星系的恒星、氣體和塵埃拉出,形成了壯觀的尾巴。闖入者星系本身,估計位于蝌蚪後面 30 萬光年處,可以通過右上角的前景螺旋臂看到。與地球同名的蝌蚪星系很可能會随着年齡的增長而失去尾巴,尾巴上的星團形成了大螺旋星系的小衛星。

資料來源 | Hubble Legacy Archive, ESA, NASA;

圖檔來源 | Astronomy Picture of the Day | 2018 December 11