美文网首页
如何发布JAR包到Maven中央仓库

如何发布JAR包到Maven中央仓库

作者: 狄仁杰666 | 来源:发表于2020-08-14 23:10 被阅读0次

    前言

    在使用Maven构建项目的时候,你是否也有过这样的思考?

    这些Maven依赖都是怎么发布到Maven中央仓库供大家使用的?

    借由最近正在做的一个API自动化相关的jar包:

    • api-automation-service

    这是一个服务于API自动化的服务,它基于Spring Boot,封装了我日常API自动化工作的一些通用类和定制类,如随机数类、日期处理类、JSONObject处理类、JSONArray处理类、TestNg监听类、TestNg断言类(包含添加Allure步骤)、自定义TestNg注解类、文件处理类、Header组装类、测试数据读取类等。
    该Jar是我开源API自动化框架、服务的第一步,目前还在做,等我完成整个API自动化框架、服务的开源工作,后续会推出API自动化框架、服务的文章,敬请期待!

    接下来我们一起来学学如何发布JAR包到Maven中央仓库!
    发布JAR到Maven中央仓库是走工单模式的,也就是说,整个过程就像像在做issue一样,我们用户作为PM给Maven官方提交issue,Maven官方会在issue内根据既定的工单规则指导用户发布JAR包到Maven中央仓库。

    整体步骤

    1). 创建Git Hub仓库;
    2). 创建工单;
    3). 下载、安装、使用gpg工具;
    4). 修改maven相关配置;
    5). 部署JAR暂存至Nexus仓库;
    6). 发布JAR至Maven中央仓库;
    7). 使用新发布后的JAR;

    1). 创建Git Hub仓库

    在进行下一步前,我们要先在自己的git hub上先创建好代码仓库,比如我的代码仓库:https://github.com/dylanz666/api-automation-service.git,这是因为创建工单时,需要填写代码仓库相关的信息!

    2). 创建工单

    如果已经发布过jar,并且groupId没有变化的话,那么不需要再创建工单了,可直接跳到步骤5),工单例子:https://issues.sonatype.org/browse/OSSRH-59878?filter=20651

    1). 创建工单(issue)的Sonatype站点:https://issues.sonatype.org/secure/Dashboard.jspa

    2. 第一次使用Sonatype,需要注册,注册时注意几个点:

    • 密码有一定的要求:必须包含一个大写字母,一个特殊字符,必须至少12位;
    • 要记得注册时所填的信息,如Email,Username,Password,因为后续其他地方还要用到;
      注册Sonatype账号

    3. 注册完成后登录,创建issue;

    (1). 可选择直接创建issue,即:Create an issue,或浏览Sonatype后,再使用Create功能创建issue,有使用过Jira同学的应该很熟悉~


    登录后

    (2). 创建issue时有几个注意点:

    • Project:选择Community Support - Open Source Project Repository Hosting (OSSRH)
    • Issue Type:选择New Project
    Create an issue

    4. 填写issue信息;

    点击Next按钮后,进入填写issue详情的页面,这里要特别注意一下:

    issue信息

    其他内容不用填写,创建Issue后需要等待一小段时间,Sonatype的工作人员审核处理,速度还是很快的,一般一个工作日以内,当Issue的Status变为RESOLVED后,就可以进行下一步操作了,工作人员会在issue上指导用户操作。

    3). 下载、安装、使用gpg工具

    1. 发布JAR包到Maven时需要一个签名过程,这个过程主要是出于安全考虑,使用的具体步骤是:

    (1).下载安装
    这个过程还是比较简单的,只需要双击执行下载好的.exe文件,傻瓜式安装,啥也不用改,gpg下载地址:https://www.gpg4win.org/download.html

    下载gpg
    (2).生成密钥
    (1).在电脑cmd窗口执行命令:gpg --gen-key
    (2).过程中需要填写名字、邮箱等,其他步骤可以使用默认值。提别注意一个叫Passphase的参数,需要记住,这个相当于是是密钥的明文密码,后续发布过程中进行签名操作的时候会用到。
    生成密钥1

    (3). 查询密钥是否生成:gpg --list-keys

    查询密钥是否生成

    (3).发送公钥
    (1). 在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995

    发送公钥

    (4).查询公钥是否已发送
    在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995
    像下面这样,即说明公钥发送成功:

    查询公钥是否已发送
    (顺便说下,该密钥在我发布文章时,已被我删除)

    4). 修改maven相关配置

    1. 假设jar的主要功能已完成;

    2. 修改pom.xml文件;

    (1). 修改个人主页url;

    <url>https://github.com/dylanz666/api-automation-service</url>
    

    这一步用户设置个人主页,不是必须的,但做了这一步之后,未来发布到中央仓库,当用户搜索到您的jar时,就有一个入口可以直接到您的git hub主页,或您设置的个人主页,如:


    个人主页

    (2). 修改pom.xml内的配置:

    <!--  For pushing jar  -->
        <licenses>
            <license>
                <name>The Apache Software License, Version 2.0</name>
                <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
                <distribution>repo</distribution>
            </license>
        </licenses>
        <scm>
            <tag>master</tag>
            <url>https://github.com/dylanz666/api-automation-service.git</url>
            <connection>scm:git:git@github.com:dylanz666/api-automation-service.git</connection>
            <developerConnection>scm:git:git@github.com:dylanz666/api-automation-service.git</developerConnection>
        </scm>
        <developers>
            <developer>
                <name>dylanz</name>
                <email>997604787@qq.com</email>
                <organization>dylanz</organization>
            </developer>
        </developers>
        <!--  For downloading jar  -->
        <repositories>
            <repository>
                <id>alimaven</id>
                <name>aliyun maven</name>
                <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
            </repository>
        </repositories>
        <!--  For pushing jar  -->
        <distributionManagement>
            <snapshotRepository>
                <id>ossrh</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            </snapshotRepository>
            <repository>
                <id>ossrh</id>
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>2.2.1</version>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar-no-fork</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>2.9.1</version>
                    <executions>
                        <execution>
                            <id>attach-javadocs</id>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-gpg-plugin</artifactId>
                    <version>1.5</version>
                    <executions>
                        <execution>
                            <id>sign-artifacts</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>sign</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    特别注意,需要添加javadoc支持、gpg使用等,上面的配置是我推荐的写法;

    3. 修改settings.xml文件;

    (1). 首先如何找到settings.xml文件呢?
    使用IDEA可以直接通过IDEA菜单栏File>Settings...>搜索Maven即可,如:

    settings.xml

    (2). 在settings.xml文件内profiles节点下加入节点:

    <profile>
        <id>ossrh</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <gpg.executable>gpg</gpg.executable>
            <gpg.passphrase>XXXX</gpg.passphrase>
        </properties>
    </profile>
    
    其中gpg.passphrase的值是步骤:3). 下载、安装、使用gpg工具中提到要记住的Passphase参数值;

    (3). 在settings.xml文件内servers节点下加入节点:

    <server>
        <id>ossrh</id>
        <username>XXXX</username>
        <password>YYYY</password>
    </server>
    

    这里有几个要注意的点:

    • id要与pom.xml中发布jar节点内使用的id一样,如二者都是ossrh:
        <!--  For pushing jar  -->
        <distributionManagement>
            <snapshotRepository>
                <id>ossrh</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            </snapshotRepository>
            <repository>
                <id>ossrh</id>
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
    
    • username和password
      正常是指sonatype注册时的用户名和密码,但不知道是由于密码没转义还是方式不对,我在发布时一直报401,401就是没权限,一般就是账号密码错误,总之死活没搞定,有知道的朋友麻烦告诉我一下,感恩!
    后来我发现另外一个途径获取加密后的用户名和密码,可以成功用于发布:

    a. 首先使用sonatype账号密码登录nexus仓库管理站点:https://oss.sonatype.org/#welcome
    b. 找到nexus仓库管理站点右上角用户名入口,打开小菜单,点击小菜单内的Profile,进入Profile菜单管理页;

    Profile
    c. 在Profile菜单管理页顶部选择User Token选项;
    选择User Token
    d. 点击Access User Token按钮,在弹出框中再次输入用户名密码,然后confirm;
    User Token
    e. 复制User Token窗口中的整个节点,修改${server}为上述的值,如:ossrh,保存settings.xml文件;

    当上述操作都执行完毕,那么准备工作就完成了,接下来准备开始发布到Nexus暂存;

    5). 部署JAR暂存至Nexus仓库

    1. 当工作人员在issue上告知我们可以开始发布了,如最后一条comment:

    可发布comment

    其实该条comment对应了pom.xml文件内的配置:

        <!--  For pushing jar  -->
        <distributionManagement>
            <snapshotRepository>
                <id>ossrh</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            </snapshotRepository>
            <repository>
                <id>ossrh</id>
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
    

    并且我们的配置工作都完成了之后,我们就开始执行发布命令了;

    2. 发布命令:

    (1). 正常情况下,值需要在cmd窗口执行命令:

    #跑测试
    mvn clean deploy
    
    #不跑测试:
    mvn clean deploy -Dmaven.test.skip=true
    

    (2). 如果遇到SSL证书问题,如:


    SSL证书问题

    我们要忽略SSL证书问题,可参考我之前写的文章:

    Maven之SSL证书错误

    (3). 命令执行过程中,会弹出一个gpg的窗口,输入前面提到的gpg明文密码Passphase,如:

    gpg的窗口
    (4). Maven显示build成功后,就可以在Nexus暂存仓库中找到你发布的jar了!
    Nexus暂存仓库地址:https://oss.sonatype.org/#welcome
    为了分享,我再次发布一次给大家看一下,发布命令:
    mvn clean deploy -Dmaven.test.skip=true -Dmaven.multiModuleProjectDirectory=$MAVEN_HOME -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
    -Dmaven.wagon.http.ssl.ignore.validity.dates=true
    
    发布成功
    Nexus暂存
    这个过程不需要等待,部署完成马上就能在Nexus暂存仓库找到,然而,这时候只是暂存在Nexus上,而没有真正发布到Maven的中央仓库中去,因此在中央仓库中是找不到的!!!

    6). 发布JAR至Maven中央仓库

    要想在中央仓库能够找到我们的jar,还需要一步Release流程;

    (1). 在Nexus暂存仓库中找到我们的jar,选中jar,点击jar上方的Close按钮;

    Close
    (2). 在弹出的Close Confirmation窗口随便填写一些信息,然后点击Confirm即可进入预Release流程,如:
    Close Confirmation
    (3). 这时可以查看底部状态菜单栏的Activity菜单,这里头显示了Close操作在做的动作(其中包括前面提到的javadoc),直到所有动作都完成,jar顶部的Release按钮就会变成可用状态,这个过程大概会耗费2~3分钟,可以刷新查看进度,如:
    Close
    (4). 点击顶部Release按钮,正式Release;
    同样可以在弹出的Release Confirmation窗口随便填写一些信息,然后点击Confirm即可开始正式Release,如:
    正式Release
    当然在点击Release按钮前,如果想取消本次发布,那么可以点击jar上方的Drop按钮,删除暂存的jar,取消本次Release;

    (5). Release过程同样也大概会耗费2~3分钟,可以刷新查看进度;
    Release完成后,Nexus暂存区Staging Repositories就找不到暂存的jar了,可以通过Artifact Search入口或Advanced Search入口查找;

    Search

    (6). Release完成后,还要等2小时左右,才能在中央仓库中找到,或者才能被其他项目引用;

    7). 使用新发布后的JAR

    (1). 其他项目中,在pom.xml文件或settings.xml指定镜像地址,也可使用国内镜像,pom.xml中的配置如下:

    <!--  For downloading jar  -->
    <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
        </repository>
    </repositories>
    

    (2). 在pom.xml文件中的dependencies节点下增加节点,如:

    <dependency>
      <groupId>com.github.dylanz666</groupId>
      <artifactId>api-automation-service</artifactId>
      <version>1.0.3</version>
    </dependency>
    

    (3). cmd窗口使用命令加载新发布的jar包:

    mvn clean install
    

    确认发布完成后,我们最好到Sonatype的issue上comment说我们已经Release好了,工作人员会帮我们关掉issue;

    到此为止,我们完成了如何发布jar到中央仓库的整个过程,整个过程总体来说稍微有点复杂,我们体验到了开源贡献者的不容易,加油!

    码字不容易,点赞需积极

    谢谢!!!

    相关文章

      网友评论

          本文标题:如何发布JAR包到Maven中央仓库

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