不学无数——发布自己的Jar包到Maven中央仓库中

发布自己的Jar包到Maven中央仓库中

Posted by 不学无数 on November 4, 2018

发布自己的包到Maven中央仓库中

现在Maven几乎成了Java事实上的包管理工具了,Gradle作为后起之秀,也是建立在Maven现有的大量仓库资源之上。使用Maven Central Repository可以很方便地解决第三方库依赖问题。那么,如何将自己开发的包也发布到Maven Central Repository上去呢?

申请SonaType网站的用户

SonaType 是什么呢?提供开源项目仓库托管(Open Source Software Repository Hosting,简称OSSRH)服务

点进去网站以后跟着下面步骤创建

  1. 点击Create

    image

    • Summary :描述自己包的作用
    • Description :可写可不写,也是具体描述的
    • Group Id :填写自己的github地址
    • Project URL:填写你的项目的github地址就可以了
    • SCM url:同样的我填写的也是github的地址

    填写完成后,就点击Create即可,随后如果审批通过的话就会在你申请的邮件箱中收到通过的邮件

    image

配置gpg加密jar包上传到构件仓库里面

  1. 安装Gpg4win

    • Mac:直接在控制台brew install gpg即可
    • Windows:下载Gpg4win生成秘钥
  2. 命令行生成生成秘钥

    gpg --gen-key

  3. 根据提示填写姓名、邮箱、备注等。生成完了之后。

    可以用下面的命令进行查看key的内容

    gpg --list-keys --keyid-format short

    image

    可以看到394A524C就是你的key值了,此时需要将其上报给服务器中

    gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 你的key值

  4. 查询是否上报成功

    gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 你的key值

配置Gradle

.gradle中创建gradle.properties文件夹,用于存储秘钥信息。里面内容如下

signing.keyId=你的key值
signing.password=之前申请时输入的密码
signing.secretKeyRingFile=在之前用gpg --list-keys --keyid-format short输出秘钥信息时,有个路径。

然后在build.gradle中配置如下

group 'com.github.modouxiansheng'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing' //使用signing plugin做数字签名
apply plugin: 'idea'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    options.addStringOption('charSet', 'UTF-8')
}
uploadArchives {
    repositories {
        mavenDeployer {
            //为Pom文件做数字签名
            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

            //指定项目部署到的中央库地址,UserName和Password就是Part 1中注册的账号。
            repository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
                authentication(userName: "UserName", password: "Password")
            }
            //构造项目的Pom文件,参见Pom文件的规范,不要遗漏必填项
            pom.project {
                name project.name
                packaging 'jar'
                description 'Toggle is a little java tool to make your life easier when you try to use Feature Toggle in Java.'
                url 'https://github.com/modouxiansheng/convenientUtil'

                scm {
                    url 'scm:git@github.com:modouxiansheng/convenientUtil.git'
                    connection 'scm:git@github.com:modouxiansheng/convenientUtil.git'
                    developerConnection 'git@github.com:modouxiansheng/convenientUtil.git'
                }

                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 'modouxiansheng'
                        name 'D.Hu'
                    }
                }
            }
        }
    }
}


task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from 'build/docs/javadoc'
}

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

artifacts {
    archives jar
    archives javadocJar
    archives sourcesJar
}

//为所有的jar包做数字签名
signing {
    sign configurations.archives
}

然后在Idea中如下图点击即可

image

如果你在控制台上看到Could not find metadata cn.yerl:android-promise/maven-metadata.xml in remote (https://oss.sonatype.org/service/local/staging/deploy/maven2),不需要理会。

在中间库中进行审批

https://oss.sonatype.org/#stagingRepositories

用你的SonaType 的账号密码进行登陆后,点击左边的Staging Repositories然后根据所写的Group Id进行查询。如果在Staging Repositories中查找不到你的项目,但是在Nexus公有库中是可以查找到你的项目的话。

那么这个问题可以忽略,因为这个是nexus-staging-maven-plugin插件中autoReleaseAfterClose 自动设置为了True,所以就自动给close->release->drop三步,相当于自动给你做了。所以等待两个小时就会在中央仓库查找到了。

通知Sonatype构件已成功发布,在之前创建的Issue中回复一条The component has been successfully released通知工作人员为需要发布的构件做审批,发布后会关闭该Issue。

查看是否jar包上传成功

中央仓库中查找就能看到已经上传的Jar包了

image

遇到的坑

  1. 当第一次进行上传的时候,version不要写成SNAPSHOT 的。这在网上都是这么说的,因为网上的大部分是用Maven上传的,所以它根据后面的版本号将其上传到哪个库中。而在Gradle中限定上传到哪个库中是在repository 中的url配置的

     https://oss.sonatype.org/content/repositories/snapshots/
    
     https://oss.sonatype.org/content/repositories/releases/
    
    

    如果第一次上传了SNAPSHOT 版本的话,那么会在Sonartype看到管理员回复的下面一段话

     I only see a SNAPSHOT release in oss.sonatype.org
    
     Note that SNAPSHOTs won't sync to Maven Central.  See: https://central.sonatype.org/pages/apache-maven.html#performing-a-snapshot-deployment
    
     Comment again when you've promoted a release version, and the sync to Central will activate.
    
    

    大概意思就是在第一次的时候不能上传SNAPSHOT 只有第一次成功了以后才可上传。

  2. Return code is: 400, ReasonPhrase: Bad Request

    在知道了第一次不能上传SNAPSHOT 版本以后,所以我就把版本号改成了Release,然后上传但是一直报这个错。最后找到了原因是因为版本号写的是Release但是url写的是SNAPSHOT 版本的。所以一直上传不上去。

参考文章