美文网首页其他
如何使用Gradle发布Jar文件到Bintray并同步到Mav

如何使用Gradle发布Jar文件到Bintray并同步到Mav

作者: 宇宙最强架构师 | 来源:发表于2017-07-14 10:24 被阅读302次

    最近想把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. 欢迎补充!

    相关文章

      网友评论

      • 恒毅_c6d2:现在的界面上怎么没有 Group Id /Project URL /SCM url 这些选项了?迁移了吗?
        宇宙最强架构师:我去看了下还是有的,你看下Project下拉框里的东西选对了没有。我这里显示两个,一个是Recent Projects,一个是All Projects,我选择All Projects里的Community Support就会出现Group Id等信息。可能界面改动过了,我也不清楚。
      • Tiimor:请问Sync Sonatype成功后要多久才会通过?
        Tiimor:@宇宙最强架构师 有没有解决同步错误的总结?我再次同步提示我有错误
        Tiimor:@宇宙最强架构师 我用的不是你这种方式,我用novoda插件上传
        宇宙最强架构师:@Tiimor 我是第二天就收到邮件了

      本文标题:如何使用Gradle发布Jar文件到Bintray并同步到Mav

      本文链接:https://www.haomeiwen.com/subject/zbsyhxtx.html