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 <[email protected]>
  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 E2A36372591567B3 to hkp://pool.sks-keyservers.net

3、Maven全局配置

一般情況下,maven全局配置存在於 HOME/.m2/setting.xml,如果這個目錄下沒有,則可以從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:[email protected]:xiaoxuetu/multithreadpool-spring-boot-starter.git</connection>
        <developerConnection>scm:git:[email protected]: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>[email protected]</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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章