最近想把Jar包上傳到Maven中央倉庫,在網上搜了下沒有特別詳細的文章,所以自己造個輪子把具體步驟記錄下來。
適合人群
- 了解如何使用Gradle構建項目
步驟
- 創建Bintray賬號
- 創建倉庫
- GPG簽名
3.1. 使用Bintray公共密鑰
3.2. 使用個人密鑰 - 創建Sonatype賬號
- 申請權限
- 編寫Gradle腳本
- 發布
開始
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_USER 和 OSSRH_PASSWORD (OSSRH = Open Source Software Repository Hosting ) 需要到以下地址查看:
使用你的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/ 的搜索并不是實時的,需要等待一段時間,通常搜索結果第二天就能更新。
結尾
有幾個點要注意:
- 上傳到Sonatype的文件無法被刪除,要更新文件只能上傳新的版本,Bintray上的文件可以自由刪除。
- Sonatype的幾個網址比較難找,最好記一下。
- 賬號不要提交到VCS中。
- 歡迎補充!