跳到主要內容

[JAVA]發布GitHub Gradle專案項目到Maven中央倉庫


前提說明:

我自己在GitHub上有個JAVA library專案,想要發佈到Maven Central,從完全不知道如何開始到上架maven完成,因此撰寫這篇做記錄提供教學,使用的電腦環境是MacOS。

流程大綱 :

1. 申請Sonatype帳號並建立專案,帳號用於之後要上傳打包後的Jar檔相關檔案到Maven Central,帳號主要是要申請Group ID,若已請申請過Group ID就不用再申請,下面範例是我用github帳號申請Maven的Group ID「io.github.raytw」,申請成功後Github發佈可跳過此步驟。
2, 下戴GPG並建立個人公、私鑰,因上傳到Maven Central所有檔案只允許用GPG rsa加密過的檔案上傳。
3. 調整Java專案裡build.gradle Maven發佈設定。
4. 在terminal command line下指令執行,並上傳相關檔到Nexus Repository Manager(發佈前暫存管理網站),再到Nexus Repository Manager網站再次確認後進行發佈後需要等待約2小時。
5. 到Maven Central Repository Search網站搜尋自己的專案名稱。

完整流程說明:

1.申請Sonatype帳號,讓GitHub帳號取得發佈到maven的Group ID

(1)在GitHub上有個專案,我的專案8ComicSDK-JAVA
(2)到Sonatype Jira註冊,首頁紅圈處是註冊入口


(3)註冊Sonatype帳號後進行登入後,按下上面工具列Create按鈕


(4)出現資料填寫頁面


欄位填寫說明 :
Project : 要發佈library到社群就選Community Support
Issue Type : 選New Project,如字面
Description : 似乎可不寫,我是有用英文簡單填寫說明
Group Id : 填寫你library存放空間,以GitHub格式固定為 io.github.使用者名稱
Project URL : Git專案存放網址
SCM url : Git專案可被直接用git下戴的連結,即網址最後是.git
Already Synced to Central : 是否目前專案有曾經同步到maven過,我選None

欄位填寫範例 :

Project : 選擇「Community Support - Open Source Project Repository Hosting (OSSRH)」
Issue Type : 選擇「New Project」
Description : This library supports comic watch and download.
Group Id : io.github.raytw
Project URL : https://github.com/RayTW/8ComicSDK-JAVA
SCM url : https://github.com/RayTW/8ComicSDK-JAVA.git
Already Synced to Central : None

最後按下下面Create按鈕即可建立issue

(5)建立issue後,Sonatype官方人員會留言要驗證步驟4提供的GitHub帳號擁有者是你自己,因此會要求你用issue編號在GitHub創建一個公開的Repository,去GitHub創建後記得用官方人員留言裡的連結點看看是否可以連結到驗證的GitHub專案
官方人員要求我在GitHub建立https://github.com/raytw/OSSRH-70157


我在GitHub創建專案名OSSRH-70157,這專案驗證後可以刪除



留言回覆官方人員已建立專案,此時就可以進行下一階段了

2.GPG安裝與使用

(1) 下戴GPG並安裝到GPG網站下戴並安裝或是在Terminal command line執行「brew install gnupg」,這裡我下戴了2.3.1版本,但我個人建議安裝LTS版本



網站上GPG版本列表,上圖紅框處是我安裝的版本



安裝後下指令查看版本「gpg --version

(2.1)建立個人公、私鑰
打開Terminal在command line執行「gpg --full-generate-key」,後續會有幾個問題要填

請選擇你要使用的金鑰種類:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (僅能用於簽署)
(14) Existing key from card
這裡是選擇(1)RSA即可

RSA 金鑰的長度可能介於 1024 位元和 4096 位元之間.
你想要用多大的金鑰尺寸? (3072) 長度越長越安全,這裡填入3072
你所要求的金鑰尺寸是 3072 位元
請指定這把金鑰的有效期限是多久.
0 = 金鑰不會過期
<n> = 金鑰在 n 天後會到期
<n>w = 金鑰在 n 週後會到期
<n>m = 金鑰在 n 月後會到期
<n>y = 金鑰在 n 年後會到期
金鑰的有效期限是多久? (0) 2y 這裡選2年,你可自己決定時間,到期後再要做展期處理
金鑰將會在 六 6/17 15:51:34 2023 CST 到期
以上正確嗎? (y/N) y
GnuPG 需要建構使用者 ID 以識別你的金鑰.
真實姓名: Ray Li
電子郵件地址: ray00000sina@gmail.com
註釋:
你選擇了這個使用者 ID:
"Ray Li <ray00000sina@gmail.com>"
這裡是最後確認資料是否都正確,確認無誤後輸入英文字母o即可
變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? o



(2.2) 公鑰上傳將個人公鑰上傳到第三方金鑰倉庫存放,提供他人進行驗證未來你自己用私鑰加密的任何檔案名件.

打開terminal在command line執行「gpg --list-secret-keys --keyid-format SHORT取得紅框處金鑰短碼


執行上傳公鑰操作,下列二選一
gpg --keyserver keyserver.ubuntu.com --send-keys B57DDABC」(主要、較穩)
gpg --keyserver hkps.pool.sks-keyservers.net --send-keys B57DDABC
上傳公鑰之後,可以到 https://keyserver.ubuntu.com/ 用e-mail查詢公鑰是否上傳成功,如下圖 : (圖片我實際上傳的公鑰,文章內是範例並未上傳)




(2.3) 輸出私鑰,後續用gradle打包jar檔時會讀取私鑰進行簽名打開terminal在command line執行「gpg --export-secret-keys B57DDABC > secring.gpg

上述操作是將私鑰存成檔案secring.gpg,再將「secring.gpg」檔案放到「/Users/使用者名稱/.gradle」,放到「/Users/ray/.gradle」(ray是我的電腦使用者名稱)

(3)java專案「build.gradle」設定

這部份我參考Maven Publish Plugin(Example 8. Publishing a Java library)與Sonatype publish gradle
幾個重點要注意:
  • pom區塊資料要填,我在實作過程漏寫url而在最後要release時送審被退件。
  • java程式原碼部份要JDoc的格式要完整,有缺漏也會在編譯時失敗。
  • 在本機路徑「/Users/ray/.gradle」存放金鑰密碼與Sonatype帳密設定檔「gradle.properties」,這文字檔要自己建立,內容如下圖。

build.gradle範例:(完整範例連結)



(4).發佈上傳檔案到Nexus Repository Manager
接續build.gradle設定完成後,請打開terminal:/
(4.1)切換路徑到專案路徑底下,以我電腦為範例路徑是「/Users/ray/Documents/workspace-2021/8ComicSDK-JAVA」
(4.2)在command line執行「./gradlew publish --stacktrace -info」,過程有錯就除吧,直到執行成功。
(4.3)登入Nexus Repository Manager查詢是否上傳成功。

在畫面左邊點選「Staging Repositories」,下圖紅框處


點擊後會出現剛剛上傳的暫存檔(此處我拿官方範例圖示範),點取專案(編號從1000開始),點按上方的「close」按鈕進行發佈審核,若審核通過後即可再按右邊的「release」進行發佈



圖片取自官方,因為我的專案發佈後暫存檔就會自動清除而沒留到圖片
按下「release」後可回到Snotype網站查看Issue,官方人員會留言(下圖紅框處)請你等待2小時左右後即可確認是否發佈到Maven Central




5. 到Maven Central Repository Search網站確認是否發佈成功(約2個小時)
Maven Central Repository Search搜尋「8comicSDK」查看結果




MVNRepository網站也查詢得到(官方較晚同步更新)

到此就全部完成了,有任何問題我也附上參考的相關資料。






留言

這個網誌中的熱門文章

當java程式設計工程師心得(15) 2022-滿14年

 現在是2022年最後一天最後一小時,blog也空了一年沒有撰寫了,來分享這2年我遇到的事情吧,在個人生活部份我完成幾件事情: 1. 2021年底時遇到了非常契合的聰明又漂亮的優秀的另一半。 2. 2022年初買了房子。 3. 2022年創了youtube頻道上傳吉他finger style影片。 4. 2021年開始試著用許多方式自學英文。 工作上也有些轉變及新的嘗試: 1. 2021年將入行多年使用的server、讀寫資料庫程式整理完後以open source方式發佈到maven。 2. 2021年開始參與公司GCP相關專案技術研究。 3. 2022年決定轉型當架構師。 上面每一項都能單獨寫一篇故事來分享給大家,上面每項的故事細節,之後我再回來補上吧 祝大家2023年新年快樂,以及幸福的與身邊的人開心過每一天

當java程式設計工程師心得(16) 2023-2週自學Golang

      距上次發文又超過半年的時間了,這次就來分享學習Golang吧,因應工作需求我要自學Golang,在這轉換過程約1個月的時間我從完全不會寫go、也不懂如何部署程式GCP上,到目前已經有初步成果寫成文章分享給大家,預計會分成3篇: 1. 我如何開始自學Golang? 2. 如何在學習GCP相關知識? 3. 如何從不懂CI/CD到規劃GitOps並在GCP上串接CI/CD? 這篇先分享第1點 我如何開始自學Golang?    我習慣做事會用 Sublime Text 做筆記,因此我初期先列出我要學的幾點 1.詢問很強的Golang大神朋友(很感謝Minchao給了我超多建議) 2.學習Golang的開發工具,我初期有用Visual Studio Code寫了hello world,後來IDE改用 Goland ,它真的太強大了      Visual Studio Code :          優點:免費          缺點:plugin要找適合自己的下載試用     Goland :         優點: 官方 有附詳細的附加功能使用說明,並且你想得到的通通都內建         缺點:試用只有30天,費用訂閱制,月付或年繳 3.了解基本型別、module、function宣告方式、常用package,例如string、array、File I/O等等…可以參考這篇 Golang roadmap 自學再加上網路搜尋大量的文章花1~2星期閱讀加上練習 4.學習 gin web framework 撰寫RESTful API(API文件可使用 Swagger )、 gorm 讀寫資料庫 5.單元測試(go test)、code format(go內建有)、code style、build執行檔相關工具或指令     有關code style其實可以參考 google官方 再加上 Uber go style 6.學習專案程式資料夾框架 project-layout    在學習過程我也發現學習Go千萬不要用JAVA的物件導向去學,反而要把JAVA的觀念拋開讓自己歸零去學習一種新的程式語言會更好吸收,也才不會讓自己觀念會卡住,Go本身的設計讓其彈性很大,對初學者建議掌握下列幾點: Struct Receiver Pointers 基本型別 容器&特

當java程式設計工程師心得(14) 2020-滿12年

今年我想分享兩件事 第一件事:       推薦最近看完的三本書的心得,書的內容對於想加強自身軟體開發能力以及朝架構師前進有些幫助 第一本 Code Complete 2: 有些章節適合project manager閱讀,可了解好的軟體開發集結的人、方法、工具,更推薦有2年以上開發經驗的軟體工程師閱讀,加強自身軟體開發觀念且功力大增,書裡寫了許多累積10年以上工程師經驗的做事方法 我個人覺得這書太晚讀到了,否則能少走好幾年的路,對我來說這本書裡提到90%以上都會了,但是這書還有一個功用,就是拿來用書裡提的數據打臉一些code亂寫的工程師🤣 第二本 無瑕的程式碼 書裡面提到許多設計原則,有些於軟體設計模式裡要應用,有些則是在系統架構上應用,也有用硬體面去套入原則,如果有碰系統架構也有寫軟體的工程師可以買來閱讀,這書能讓自己理清一些盲點。 第三本 Working Effectively with Legacy Code中文版:管理、修改、重構遺留程式碼的藝術 強烈推薦軟體工程師看這本書,內容講解如何對既有系統的code進行重構後可被測試,進而加新功能或提高程式的閱讀性及維護性,並且始終確保程式原功能不被破壞,書內介紹許多重構code高超技術,有讀有保佑,沒讀會出事🤣!裡面附的範例code為JAVA80%及C++20%,強力推薦大家閱讀來增強程式功力 第二件事:       我在google上搜尋"java吉他手"意外搜尋到一篇文章提到我,點進文章看原來是5年前曾來我網誌向我詢問過問題的網友寫的,我印象中有個網友向我詢問他想轉職相關的問題,最後我有給些建議,沒想到這位網友已經轉職且與我同行都是做後端,看文章內容也已經經歷了軟體業的洗禮了,在此一樣祝福他能工作更順利,朝自己的目標前進並加油努力,也對於還有這位網友記得我的網誌,我非常開心,我經營網誌撒出去的種子終於開花結果了(拉人入坑軟體業),哈哈哈。             最後聊聊今年心得,在工作上我也經歷了自身單內的部門對立、惡鬥、也曾深信一個人的人性,變成被這個人抺黑、我被拱成該部門共同敵人,對於這些事一開始會無法接受並讓自己陷入負面情緒狀態,慢慢的學會人要放下,不隨波逐流、也不被陷入對方的圈套或操弄而起舞,每個人進入這行追求的目標都不一樣: 有人追求薪水普通、工作不求質不求快、上班時上網網購