• Maven中央仓库发布历程


    一、前言

    最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,通过这个组件,我们可以动态根据配置文件进行多个线程池的初始化。既然有这个产出后,肯定是希望能够上传到maven中央仓库,给更多的人使用,于是就产生了这次项目发布经历。

    整个过程可谓是一波三折,由于平时工作比较忙只能晚上花一个小时搞,所以在经历了近一周的时间后,终于成功发布上去了。

    下面把我当时的上传过程记录下来,希望帮助更多的朋友。

    二、环境准备

    1> mac osx 10.14.6 : 本文主要以mac环境为准

    2> Apache Maven 3.2.3 : 本文主要使用maven进行构建和发布例子的说明

    三、步骤说明

    1、工单创建

    1> 访问sonatype并注册账号 https://issues.sonatype.org ,注意要记住账号密码,会用于我们后续的发布及相关操作

    2> 如图新建一个issue,项目需要选择 Community Support - Open Source Project Repository Hosting

    3>  参考下图填写概要、Group Id、项目地址、代码管理地址,填写后点击确认提交。网上很多都说需要几个小时或者隔天才有回复,我当时等了10分钟就收到回复了。此时,对方跟你说两件事情:

    • 【提醒】确保 group id对应的域名是你的
    • 【校验】比如我是的项目地址是github上的,他会要求我在github上创建一个和issue同名的项目确保我拥有该项目的管理权限,

    完成确认并创建和issue同名的项目后,记得要在issue进行回复,具体参考: sonatype-issue 和 Github仓库

    4> 在通过上述的确认和校验后,sonatype会回复你到时候maven发布会用到的snapshot地址和release地址,并提醒你首次发布后需要回复该issue,详情参考issue

    2、gpg 环境安装

    gpg的主要作用是生成密钥对,会用于后续我们组件发布的校验。

    1> 下载地址:https://www.gnupg.org/download/

    2> 如图红色框所示下载并安装

    3> 在安装完成后,执行以下命令生成密钥对,按照提示输入账号、邮箱、密码 (PS: 此处的密码在后面发布会用到,请务必记住)

    gpg2 --gen-key 

     4> 执行命令查看密钥, 此时控制台会输出类似下面的内容

    $ gpg2 --list-keys 
    ...

      pub rsa2048 2019-04-12 [SC] [有效至:2021-04-11]
      9A1640F7A2551131612D51B12D83594B7B29D86A
      uid [ 绝对 ] xiaoxuetu <xiaoxuetu@163.com>
      sub rsa2048 2019-04-12 [E] [有效至:2021-04-11]

    5> 执行以下命令将公钥发布到服务器中

    $ gpg --keyserver hkp://subkeys.pgp.net --send-keys 9A1640F7A2551131612D51B12D83594B7B29D86A
    ...
    gpg: 正在发送密钥 2D83594B7B29D86A 到 hkp://subkeys.pgp.net
    gpg: 发送至公钥服务器失败:Server indicated a failure
    gpg: 发送至公钥服务器失败:Server indicated a failure

    6> 如果控制台输出如上面类似的错误内容,则将命令中的密钥调整为 2D83594B7B29D86A

    $ gpg --keyserver hkp://subkeys.pgp.net --send-keys 2D83594B7B29D86A

      gpg: sending key 2D83594B7B29D86A to hkp://pool.sks-keyservers.net

     

    3、Maven全局配置

    一般情况下,maven全局配置存在于 ${HOME}/.m2/setting.xml ,如果这个目录下没有,则可以从 ${MAVEN_HOME}/conf/setting.xml 拷贝一份到 ${HOME}/.m2 目录下并进行以下修改

    1> 添加服务器验证信息

        <server>
          <id>sonatype_releases</id>
          <username>your user name</username>
          <password>your password</password>
        </server>
        <server>
          <id>sonatype_snapshots</id>
          <username>your user name</username>
          <password>your password</password>
        </server>

    2> 配置gpg验证命令

    <settings>
      <profiles>
        <profile>
          <id>gpg</id>
          <properties>
            <!-- 由于我电脑安装的是gpg2,不存在gpg命令,所以需要指定执行gpg2,否则会报错 -->
            <gpg.executable>gpg2</gpg.executable>
            <gpg.passphrase>your password</gpg.passphrase>
          </properties>
        </profile>
      </profiles>
      <activeProfiles>
        <activeProfile>gpg</activeProfile>
      </activeProfiles>
    </settings>

    4、项目maven配置

    1> 在项目的pom.xml中,配置相应的开源协议、仓库信息、开发人员信息和发布配置

    <!-- 开源签名证书 -->
        <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>
            <connection>scm:git:git@github.com:xiaoxuetu/multithreadpool-spring-boot-starter.git</connection>
            <developerConnection>scm:git:git@github.com:xiaoxuetu/multithreadpool-spring-boot-starter.git
            </developerConnection>
            <url>http://github.com/xiaoxuetu/multithreadpool-spring-boot-starter/tree/master</url>
        </scm>
    
    
        <!-- 开发人员信息 -->
        <developers>
            <developer>
                <name>xiaoxuetu</name>
                <email>xiaoxuetu@163.com</email>
                <organization>https://github.com/xiaoxuetu</organization>
                <timezone>+8</timezone>
            </developer>
        </developers>
    
        <!-- 发布管理信息 -->
        <distributionManagement>
            <repository>
                <!-- 这里的id必须要和全局配置中的release id 一致 -->
                <id>sonatype_releases</id>
                <name>Nexus Release Repository</name>
                <!-- 这里就是在创建issue成功后,对方回复的release发布地址-->
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
            </repository>
            <snapshotRepository>
                <!-- 这里的id必须要和全局配置中的snapshot id 一致 -->
                <id>sonatype_snapshots</id>
                <name>Nexus Snapshot Repository</name>
                <!-- 这里就是在创建issue成功后,对方回复的snapshot发布地址-->
                <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            </snapshotRepository>
        </distributionManagement>

    2> 由于发布到maven中央仓库会要求我们在上传jar到同时,必须同步发布对应到Javadoc、source、asc(利用gpg生成到校验),所以需要在maven中添加以下构建插件

        <build>
            <plugins>
                <plugin>
                    <groupId>org.sonatype.plugins</groupId>
                    <artifactId>nexus-staging-maven-plugin</artifactId>
                    <version>1.6.7</version>
                    <extensions>true</extensions>
                    <configuration>
                        <!-- 这里的id必须要和全局配置中的release id 一致 -->
                        <serverId>sonatype_releases</serverId>
                        <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                        <!-- 如果希望发布后自动执行close和release操作,此处可以调整为true -->
                        <autoReleaseAfterClose>false</autoReleaseAfterClose>
                    </configuration>
                </plugin>
    
                <!-- 生成java source.jar -->
                <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>
    
                <!-- 生成asc 校验文件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-gpg-plugin</artifactId>
                    <version>1.5</version>
                    <executions>
                        <execution>
                            <!-- 必须和配置中的gpg校验id一致 -->
                            <id>gpg</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>sign</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

      

    5、发布操作

    1> 执行以下命令进行发布(如果 pom.xml 中 autoReleaseAfterClose 的值为true,则脚本会自动完成在平台上close、release的操作,至此你将成功发布了,否则我们继续查看第2步)

     mvn clean javadoc:jar deploy -P release

    2> 登录https://oss.sonatype.org,然后选择staging Repositories

    3> 如下图搜索并选择需要发布的组件,依次执行Close、Release操作

    4> 如果Release成功,并且你是首次发布组件,则需要到你创建到issue中回复 “我已经成功发布该组件”,经历大概2小时后,该组件将会同步到对应的maven仓库

    5> 如果Close或者Release不成功,你可以如下图操作查看原因并谷歌定位,或者回复咨询

    四、参考文档

    1> 发布构件到 Maven 中央仓库遇到的坑: https://juejin.im/post/5cb03e1a5188251b0e4e3583

    2> Working with PGP Signatures: https://central.sonatype.org/pages/working-with-pgp-signatures.html#distributing-your-public-key

    3> Deploying to OSSRH with Apache Maven: https://central.sonatype.org/pages/apache-maven.html

  • 相关阅读:
    剑指offer题解(python版)(更新到第16题)
    Java基础知识详解:值传递
    [LeetCode] 583. Delete Operation for Two Strings
    [LeetCode] 856. Score of Parentheses
    [LeetCode] 1129. Shortest Path with Alternating Colors
    [LeetCode] 1561. Maximum Number of Coins You Can Get
    [LeetCode] 1052. Grumpy Bookstore Owner
    [LeetCode] 991. Broken Calculator
    [LeetCode] 1054. Distant Barcodes
    [LeetCode] 1245. Tree Diameter
  • 原文地址:https://www.cnblogs.com/xiaoxuetu/p/11273608.html
Copyright © 2020-2023  润新知