如何使用Gradle發布Jar文件到Bintray并同步到MavenCentral

最近想把Jar包上傳到Maven中央倉庫,在網上搜了下沒有特別詳細的文章,所以自己造個輪子把具體步驟記錄下來。

適合人群

  • 了解如何使用Gradle構建項目

步驟

  1. 創建Bintray賬號
  2. 創建倉庫
  3. GPG簽名
    3.1. 使用Bintray公共密鑰
    3.2. 使用個人密鑰
  4. 創建Sonatype賬號
  5. 申請權限
  6. 編寫Gradle腳本
  7. 發布

開始

1.創建Bintray賬號

前往 bintray.com ,右上角點擊 Sign In 跳轉到登錄頁面,可以選擇通過第三方賬號登錄或者自己注冊一個,方便起見我直接用了Github賬號。

2.創建倉庫

登錄后點擊左側的 Add new Repository按鈕 跳轉到創建倉庫的頁面,Name一欄填寫倉庫的名字,這里我寫的是maven,倉庫類型選 Maven ,創建完成后倉庫就可以使用了。

3.GPG簽名

GPG(GnuPG)是一款非對稱加密軟件,上傳的Jar包需要用GPG生成簽名文件,否則是不能同步到MavenCentral的,使用GPG給文件簽名需要有公鑰,可以用Bintray提供的默認的公鑰或者使用自己生成的公鑰,以下兩種方法二選一。

3.1.使用Bintray公共密鑰

該方法比較便捷,不需要進行生成密鑰等繁瑣操作。首先進入你創建的倉庫頁面,點擊 Edit ,進入編輯頁面。

然后勾選如圖所示的選項,當你上傳Jar文件時系統就會自動幫你生成簽名文件。

3.2.使用個人密鑰

首先需要下載 GnuPG ,以MacOS為例,下載 GnuPG for OS X

下載安裝完成后測試下是否可用:

gpg2 --version

生成key,過程中需要依次輸入Name,Email,Passphase,其中email會作為你的用戶ID。需要注意的是如果設置了Passphase,Bintray就無法對你的上傳的文件自動簽名。

gpg2 --gen-key

查看剛才生成的key:

gpg2 --list-keys

然后把公鑰 發布到服務器:

gpg2 --keyserver hkp://ha.pool.sks-keyservers.net --send-keys pojo.zhang@gmail.com

在發布過程中我遇到了 gpg: keyserver send failed: No route to host的錯誤,解決方法是多試幾個地址,下面是幾個候選地址:

導出公鑰和私鑰:

gpg2 --armor --export pojo.zhang@gmail.com > public_key_sender.asc
gpg2 --armor --export-secret-key pojo.zhang@gmail.com > private_key_sender.asc

然后回到Bintray的界面,點擊右上角導航欄的頭像,點擊 Edit Profile

跳轉到以下頁面,點擊GPG Signing。

把剛才導出的公鑰和私鑰粘貼進去,包括虛線的兩行文本,然后點擊 Update。

回到倉庫頁面,點擊Edit。

開啟自動簽名功能,配置就完成了。

4.創建Sonatype賬號

前往 issues.sonatype.org/login.jsp 進行注冊。

5.申請權限

第一次登錄時會讓你設置語言、頭像等信息,按需設置。

到如下圖所示步驟時,選擇中間的 Create an issue

在跳轉的頁面中如下圖所示填寫。

接下來要填寫項目相關的一些信息,這里說明一下幾個必填項:

  • Summary - 項目簡介
  • Group Id - 如果你有自己的域名就可以填在這里,比如io.spring,或者com.github.xxx,如果你填了自己的域名,提交申請后Sonatype的人會向你確認你擁有這個域名
  • Project URL - 項目的網站地址
  • SCM url - git或svn倉庫地址

點擊Create提交你的申請。

通常第二天就能得到申請的答復,可以在Sonatype JIRA的Comments標簽中查看,也會以郵件的形式發到你注冊時用的郵箱中。

等到JIRA上Status顯示成 RESOLVED ,你的倉庫就能使用了。

6.編寫Gradle腳本

萬事俱備,只欠東風!準備好你的項目,把下面的Gradle腳本加入到項目中。

    buildscript {
     repositories {
                    //使用阿里的maven鏡像
     maven { url 'http://maven.aliyun.com/nexus/content/groups/public'}
     }
     dependencies {
                    //引入bintray插件
     classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
     }
    }
    
    task sourcesJar(type: Jar, dependsOn: classes) {
     classifier = 'sources'
     from sourceSets.main.allSource
    }
    
    task javadocJar(type: Jar, dependsOn: javadoc) {
     classifier = 'javadoc'
     from javadoc.destinationDir
    }
    
    apply plugin: 'java-library'
    apply plugin: 'maven-publish'
    apply plugin: 'com.jfrog.bintray'
    
    def pomConfig = {
     licenses {
     license {
     name "The Apache Software License, Version 2.0"
     url "http://www.apache.org/licenses/LICENSE-2.0.txt"
     distribution "repo"
     }
     }
     developers {
     developer {
     id "developerName"
     name "developerName"
     email "developer@example.com"
     }
     }
     scm {
                    //項目網站
     url "https://github.com/example"
     }
    }
    
    publishing {
     publications {
     MyPublication(MavenPublication) {
     from components.java
     artifact sourcesJar
     artifact javadocJar
     groupId 'com.example'
     artifactId 'projectName'//com.example.projectName
     version alohaVersion
     pom.withXml {
     def root = asNode()
     root.appendNode('description', 'project description')
     root.appendNode('name', 'projectName')
     root.appendNode('url', 'https://github.com/example')
     root.children().last() + pomConfig
     }
     }
     }
    }
    
    bintray {
     user = BINTRAY_USER//bintray的用戶名,即顯示在導航欄右側的名字
     key = BINTRAY_KEY//Api key,見下文
     publications = ['MyPublication']//關聯到上文maven publication的名字
     publish = true//如果false,還需要到網頁上手動發布
     pkg {
     repo = 'maven'
     name = 'projectName'
     licenses = ['Apache-2.0']
     vcsUrl = 'https://github.com/example.git'
     labels = ['java', 'spring', 'example']
     version {
     name = '1.0.0-FINAL'
     desc = 'description'
     released = new Date()
     vcsTag = '1.0.0-FINAL'
     mavenCentralSync {
     sync = true//是否同步到中央倉庫
     user = OSSRH_USER//見下文
     password = OSSRH_PASSWORD//見下文
     }
     }
     }
    }

其中 BINTRAY_KEY 的值設為Api key,從下圖所示位置獲取:

OSSRH_USEROSSRH_PASSWORD (OSSRH = Open Source Software Repository Hosting ) 需要到以下地址查看:

https://oss.sonatype.org

使用你的Sonatype賬號登錄,點擊 Profile

點擊 Access User Token 查看你的Token:

左邊輸入框是你的username,右邊是你的密碼,建議把賬號有關的信息從環境變量中讀取,不要提交到VCS中。

7.發布

執行gradle命令進行發布:

./gradlew bintrayUpload

首次發布時如果Gradle設置了同步到MavenCentral,那么會出現以下的錯誤提示:
> Could not sync 'pojozhang/maven/com.example:projectName/1.0.0-FINAL' to Maven Central: HTTP/1.1 403 Forbidden [message:In order to sync to Maven Central your package must be included in the JCenter repository]

讓我們回到Bintray上之前創建的maven倉庫,這時你能在倉庫的頁面看到你剛才上傳的包了,類似下圖:

點擊包名,跳轉后,在頁面的右側你會找到 Add to JCenter 的按鈕,點擊它繼續跳轉。

你可以填寫一些信息,也可以直接點擊Send,過一段時間,系統會發送郵件提示你申請已經通過。

再回到剛才包的頁面,點擊 Maven Central,輸入你的Sonatype的Token信息點擊Sync,就可以完成同步了。第一次同步成功后,Sonatype也會通過郵件告知你 。

以后再發布新版本的時候直接執行Gradle命令就行了。同步完成后可以馬上在 https://oss.sonatype.org 進行搜索,但是 https://mvnrepository.com/ 的搜索并不是實時的,需要等待一段時間,通常搜索結果第二天就能更新。

結尾

有幾個點要注意:

  1. 上傳到Sonatype的文件無法被刪除,要更新文件只能上傳新的版本,Bintray上的文件可以自由刪除。
  2. Sonatype的幾個網址比較難找,最好記一下。
  3. 賬號不要提交到VCS中。
  4. 歡迎補充!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容