如何使用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阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容