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

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

適合人群

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

步驟

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

開始

1.創(chuàng)建Bintray賬號

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

2.創(chuàng)建倉庫

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

3.GPG簽名

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

3.1.使用Bintray公共密鑰

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

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

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

然后把公鑰 發(fā)布到服務器:

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

在發(fā)布過程中我遇到了 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 ,

跳轉(zhuǎn)到以下頁面,點擊GPG Signing。

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

回到倉庫頁面,點擊Edit。

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

4.創(chuàng)建Sonatype賬號

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

5.申請權限

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

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

在跳轉(zhuǎn)的頁面中如下圖所示填寫。

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

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

點擊Create提交你的申請。

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

等到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 {
                    //項目網(wǎng)站
     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']//關聯(lián)到上文maven publication的名字
     publish = true//如果false,還需要到網(wǎng)頁上手動發(fā)布
     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,從下圖所示位置獲?。?/p>

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

https://oss.sonatype.org

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

點擊 Access User Token 查看你的Token:

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

7.發(fā)布

執(zhí)行gradle命令進行發(fā)布:

./gradlew bintrayUpload

首次發(fā)布時如果Gradle設置了同步到MavenCentral,那么會出現(xiàn)以下的錯誤提示:
> 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上之前創(chuàng)建的maven倉庫,這時你能在倉庫的頁面看到你剛才上傳的包了,類似下圖:

點擊包名,跳轉(zhuǎn)后,在頁面的右側你會找到 Add to JCenter 的按鈕,點擊它繼續(xù)跳轉(zhuǎn)。

你可以填寫一些信息,也可以直接點擊Send,過一段時間,系統(tǒng)會發(fā)送郵件提示你申請已經(jīng)通過。

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

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

結尾

有幾個點要注意:

  1. 上傳到Sonatype的文件無法被刪除,要更新文件只能上傳新的版本,Bintray上的文件可以自由刪除。
  2. Sonatype的幾個網(wǎng)址比較難找,最好記一下。
  3. 賬號不要提交到VCS中。
  4. 歡迎補充!
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容