美文网首页
发布自己的Jar包到Maven中央仓库中

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

作者: 不学无数的程序员 | 来源:发表于2018-11-26 13:34 被阅读0次

    发布自己的包到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值

    1. 查询是否上报成功

      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版本的。所以一直上传不上去。

    参考文章

    相关文章

      网友评论

          本文标题:发布自己的Jar包到Maven中央仓库中

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