天天看點

使用gpg插件釋出jar包到Maven中央倉庫 完整實踐

本文記錄了在maven環境下使用gpg插件将 jar 包部署到中央倉庫并快速檢驗和更新的完整實踐過程。相對于網上其他教程使用oss-parent作為父工程的方法,這種方法入侵度低,自由度高,也是官方推薦使用的。實踐過程解決了gpg驗證以及javadoc注解不規範的問題。

文章目錄

    • 先行知識
      • 1 項目基礎配置
      • 2 Maven釋出相關網址
      • 3 釋出事項
    • 一 注冊并送出工單(register sonatype)
    • 二 使用gpg生成密鑰
    • 三 完成maven配置
      • 1 配置 setting.xml
      • 2 配置pom檔案基本資訊
      • 3 在pom檔案裡配置gpg相關插件
    • 四 完成第一次釋出
      • 1 運作 deploy
      • 2 到issue添加comment
      • 3 檢視 search.maven.org
    • 五 版本更新
    • 六 其他

先行知識

1 項目基礎配置

首先需要注意項目的 groupId,下文注冊sonatype賬号時也需要填寫 groupId ,兩者最好一緻,并確定你擁有該域名所有權,我推薦用GitHub個人首頁作為對應位址。格式為 com.github.username

本文以如下配置為例:

<groupId>com.github.linshenkx</groupId>
    <artifactId>rpc-netty-spring-boot-starter</artifactId>
    <version>1.0.0.RELEASE</version>
           

2 Maven釋出相關網址

在整個釋出過程中,有以下3個關鍵網址,注意前2個共用一個賬号。

  1. 工單管理:https://issues.sonatype.org

    負責申請上傳資格及完成第一次上傳,後續更新不需要使用,相當于一個啟動裝置。

  2. 構件倉庫 : https://oss.sonatype.org

    上傳的jar包會先存放到這裡,在這裡進行 Release 後即可釋出到maven中央倉庫。

  3. 鏡像倉庫: http://search.maven.org

    最終成功釋出的jar可以在這裡搜到。

3 釋出事項

網上有些人說使用相同版本号部署可以覆寫原版本,經試驗是不行的,也很好了解,對于同一個版本的jar包,怎麼可能因為拉取時間的不同而導緻獲得内容的不同呢?是以,應該将每一次上傳部署都看作不可逆操作,謹慎對待。

一 注冊并送出工單(register sonatype)

首先進入 https://issues.sonatype.org 新增賬號并登入

然後點選最上面的 Create建立Issue,選擇Project和Issue Type如下

使用gpg插件釋出jar包到Maven中央倉庫 完整實踐

除了這兩個選擇項外,其他的必填項按照提示填就好,需要特别注意的是,你要擁有GroupId對應的域名的所有權,私有域名的話需要驗證所有權會比較麻煩(在Attachment項提供證書),個人的話最好就是使用項目對應托管平台的首頁,這樣可以省去驗證的步驟。建立完成可見如下:

注意這個過程是需要背景管理者稽核的,一般在2個小時左右即會有回複,在稽核通過之前 Issue 的狀态将是 open,通過後為 resolved ,有問題的話 Resolution 将顯示 Unresolved 直到你解決後才會顯示為 Fixed。

使用gpg插件釋出jar包到Maven中央倉庫 完整實踐

項目的驅動将通過Comments來進行,如下,通過後管理者将添加如下comment

Configuration has been prepared, now you can:

Deploy snapshot artifacts into repository https://oss.sonatype.org/content/repositories/snapshots

Deploy release artifacts into the staging repository https://oss.sonatype.org/service/local/staging/deploy/maven2

Promote staged artifacts into repository ‘Releases’

Download snapshot and release artifacts from group https://oss.sonatype.org/content/groups/public

Download snapshot, release and staged artifacts from staging group https://oss.sonatype.org/content/groups/staging

前面兩個倉庫用于上傳,分别對應工程的 snapshots版本和 release版本,要配置到pom檔案裡。

釋出成功的工程可以通過後面兩個倉庫檢視和下載下傳,晚點會同步到中央倉庫裡。

二 使用gpg生成密鑰

這一步我主要參考了官方指南 https://central.sonatype.org/pages/working-with-pgp-signatures.html 上面用指令行的方式一步步寫得很清楚了,不過我發現其過程比較适用于Linux環境,Windows環境下有所不同

我使用的環境是window和maven,使用mac和gradle的也可以參考,但後面maven配置具體步驟會有不同,需要注意。

這裡我推薦使用gpg的gui工具,可視化生成密鑰,也可以使用指令行。

Windows的話先到 https://gpg4win.org/download.html 下載下傳最新的版本,直接安裝即可打開即可

  1. 建立密鑰對(OpenPGP類型)

    這裡需要填入名字和電子郵件,然後注意可以在進階設定那裡将有效期一欄的小勾取消掉,即有效期無限,如下

    使用gpg插件釋出jar包到Maven中央倉庫 完整實踐
  2. 确認資訊并輸入密碼
  3. 選擇将公鑰上傳到目錄服務

    注意:如果這裡不點的話後面分發後将無法在伺服器找到對應公鑰

    使用gpg插件釋出jar包到Maven中央倉庫 完整實踐
  4. 右鍵選擇生成的證書在伺服器上釋出
  5. 根據密鑰ID在伺服器上查找公鑰

    最終必須保證這一步成功!如下

    使用gpg插件釋出jar包到Maven中央倉庫 完整實踐
注意:這裡有個bug,如果生成的密鑰ID的第一個字元是數字0的話,在下面使用maven-gpg插件的時候可能會被自動去掉導緻密鑰找不到,是以保險起見遇到這種情況就重新生成證書

三 完成maven配置

這裡主要參考 https://central.sonatype.org/pages/apache-maven.html

注意網上很多教程都使用了将pom父工程設定為 org.sonatype.oss:oss-parent的方法,這種方法對工程侵入性極強,官方已經标記為 不推薦使用 了。

1 配置 setting.xml

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>your-jira-id</username>
      <password>your-jira-pwd</password>
    </server>
  </servers>
</settings>
           

如果使用的是Mac系統,由于使用的是 gpg2 還需要在正在使用的profile下配置如下屬性

<properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>the_pass_phrase</gpg.passphrase>
      </properties>
           

2 配置pom檔案基本資訊

在pom檔案裡添加developers、scm、licenses等資訊,如下

<developers>
        <developer>
            <name>LinShen</name>
            <email>[email protected]</email>
        </developer>
    </developers>

    <scm>
        <connection>scm:git:https://github.com/linshenkx/rpc-netty-spring-boot-starter</connection>
        <developerConnection>scm:git:[email protected]/linshenkx/rpc-netty-spring-boot-starter.git</developerConnection>
        <url>https://github.com/linshenkx/rpc-netty-spring-boot-starterr</url>
        <tag>HEAD</tag>
    </scm>

    <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>
            <comments>A business-friendly OSS license</comments>
        </license>
    </licenses>
           

3 在pom檔案裡配置gpg相關插件

根據官方指南,這裡需要4個插件,

  1. maven-source-plugin 用來生成Source Jar檔案
  2. maven-javadoc-plugin 用來生成 javadoc 文檔
  3. maven-gpg-plugin 用來對工程檔案進行自動簽名
  4. nexus-staging-maven-plugin 用來将工程釋出到中央倉庫

    另外注意生成javadoc文檔時需要指定關閉doclint,不然可能因為使用了不規範的javadoc注解而導緻失敗,完整配置如下

<build>
        <plugins>
            <!--生成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>
            <!--生成Javadoc,關閉doclint,避免注解檢查不通過-->
            <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>
                        <configuration>
                            <additionalparam>-Xdoclint:none</additionalparam>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!--Maven GPG插件用于使用以下配置對元件進行簽名-->
            <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>
            <!--Nexus Staging Maven插件是将元件部署到OSSRH并将其釋出到Central Repository的推薦方法-->
            <plugin>
                <groupId>org.sonatype.plugins</groupId>
                <artifactId>nexus-staging-maven-plugin</artifactId>
                <version>1.6.7</version>
                <extensions>true</extensions>
                <configuration>
                    <serverId>ossrh</serverId>
                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                    <autoReleaseAfterClose>true</autoReleaseAfterClose>
                </configuration>
            </plugin>
        </plugins>
    </build>
           

注意我這裡在 nexus-staging-maven-plugin 插件裡開啟了自動 Release。也可以關掉,然後登入構件倉庫 : https://oss.sonatype.org 手動去 close然後 relseae

四 完成第一次釋出

1 運作 deploy

這裡建議在確定能正确運作的前提下跳過測試,即在pom檔案所在目錄下運作如下指令

mvn clean deploy -Dmaven.test.skip=true
           

運作的過程會要求輸入 gpg的私鑰密鑰。

最後的輸出應該如下,即先上傳再close,再release。

中間如果出錯直接在控制台就可以檢視到資訊,也可以去構件倉庫看。

使用gpg插件釋出jar包到Maven中央倉庫 完整實踐

2 到issue添加comment

上述步驟順利完成後到issue下評論,如下,第一次在close的時候就已經失敗了,我沒有注意到就去comment,背景管理者提醒我去檢視錯誤資訊,第二次comment後就順利通過。大概過兩個小時就可以去 search.maven.org 檢索上傳的jar包了。

使用gpg插件釋出jar包到Maven中央倉庫 完整實踐

3 檢視 search.maven.org

如下,根據groupId進行檢索,需要注意的是,目前結果還不是完整的,事實上,有些快一點的2個小時後即可檢索到,有些則花了6個小時,有些還不止,是以當工程比較大的時候請耐心等候。

使用gpg插件釋出jar包到Maven中央倉庫 完整實踐

如果擔心是哪裡出問題的話可以先到 https://oss.sonatype.org/content/groups/public 或者 https://oss.sonatype.org/content/groups/staging 檢視上傳是否成功,也可以在pom檔案裡将設定這些倉庫,可以最快拉取到最新版本。

五 版本更新

更改版本号再直接部署操作即可,不需要再去issue進行comment,等待時間會短很多。網上有些人說使用相同版本号部署可以覆寫原版本,經試驗是不行的,也很好了解,對于同一個版本的jar包,怎麼可能因為拉取時間的不同而導緻獲得内容的不同呢?是以,應該将每一次上傳部署都看作不可逆操作,謹慎對待。

六 其他

參考資料:

https://central.sonatype.org/pages/apache-maven.html

https://central.sonatype.org/pages/working-with-pgp-signatures.html

https://www.gnupg.org/howtos/zh/index.html

https://docs.kde.org/stable5/en/pim/kleopatra/index.html

https://stackoverflow.com/questions/28846802/how-to-manually-publish-jar-to-maven-central/42917618