發佈jar包到maven中央庫

最近將一個開源項目發佈到maven中央庫,記錄一下發布過程,以及遇到的坑。

創建賬號

sonatype是使用jira管理工單的,如果我們要新建工單,首先需要創建一個賬號,這個賬號同樣可以用sonatype的Nexus,我們通過Nexus最終發佈到中央庫。

打開鏈接 https://issues.sonatype.org/secure/Signup!default.jspa 去註冊一個賬號

創建工單

登錄jira管理界面後,點擊上方 Create 按鈕,創建工單。

這裏寫圖片描述

Project: 選 Community Support - Open Source Project Repository Hosting
Type: 選 New Project
Summary: 主題,必填, 根據實際情況填寫
Description: 描述,選填, 根據實際情況填寫
Attachment: 附件,選填
Group Id: 項目的GroupId, 同pom.xml中的GroupId一致, 必填
Project URL: 項目的url, 必填,如果項目代碼在github上,一般填入項目的github url
SCM url: SMC(Software Configuration Management)是軟件配置管理的意思,如果項目代碼在github上,填入github的下載地址 如 [email protected]:SpringCloud/spring-cloud-gray.git
Already Synced to Central: 是否已經同步到中央庫,如果沒有選No就可以了。

然後點Create提交,等待工作人員review。這時,工單的狀態是Open, 如果提供的信息沒有問題的話, 狀態會從open變成resolved。當然由於時差的關係,一般會在下午或晚上收到回覆。

這裏寫圖片描述

在這過程中,我收到的第一個回覆是詢問我是否擁有springcloud.cn域名的所有權,因爲工單中填寫的groupId是cn.springcloud。

第二個回覆是將狀態從Open變爲Resolved時回覆,表示可以進行下一步操作了。

配置工程pom.xml

第一種是在工程的pom.xml中引入oss-parent父依賴,可以省去一些發佈配置:

<parent>
        <groupId>org.sonatype.oss</groupId>
        <artifactId>oss-parent</artifactId>
        <version>7</version>
</parent>

接着在pom中完善license、scm、developer的信息。
但是這種方式在已經有父依賴的情況下就很尷尬,建議採下面第二種。

第二種是將oss-parent中的配置複製出來,然後稍做修改,以spring-cloud-grap爲例:

<groupId>cn.springcloud.gray</groupId>
    <artifactId>spring-cloud-gray</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>
    <modules>
        ...
    </modules>

    <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>[email protected]:SpringCloud/spring-cloud-gray.git</url>
        <connection>scm:git:[email protected]:SpringCloud/spring-cloud-gray.git</connection>
        <developerConnection>scm:git:[email protected]:SpringCloud/spring-cloud-gray.git</developerConnection>
    </scm>
    <developers>
        <developer>
            <name>saleson</name>
            <email>[email protected]</email>
            <organization>Spring Cloud中國社區</organization>
        </developer>
    </developers>

    <dependencyManagement>
        ...
    </dependencyManagement>

    <profiles>
        <profile>
            <id>sonatype-oss-release</id>
            <build>
                <plugins>
                    <!-- Source -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.2.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- Javadoc -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.9.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- GPG -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.1</version>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>sonatype-nexus-snapshots</id>
                    <url>
                        https://oss.sonatype.org/content/repositories/snapshots
                    </url>
                </snapshotRepository>
                <repository>
                    <id>sonatype-nexus-staging</id>
                    <url>
                        https://oss.sonatype.org/service/local/staging/deploy/maven2
                    </url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>

可參考 https://github.com/SpringCloud/spring-cloud-gray/blob/master/pom.xml

配置maven setting.xml添加server

打開maven的settings.xml配置文,配置sonatype賬號信息

  <servers>
    <server>
      <id>sonatype-nexus-snapshots</id>
      <username>Sonatype 賬號</username>
      <password>Sonatype 密碼</password>
    </server>
    <server>
      <id>sonatype-nexus-staging</id>
      <username>Sonatype 賬號</username>
      <password>Sonatype 密碼</password>
    </server>
  </servers>

注意server.id需要和工程pom.xml中的snapshotRepository.id對應上。

配置gpg-key

gpg-key是用來對代碼、二進制包進行簽名校驗用的,windows系統通過https://www.gpg4win.org/download.html下載安裝,例如Mac的安裝:

運行命令,安裝gpg

brew install gpg

在使用brew安裝的時候,還出現過一次因爲權限導致安裝失敗的情況,而使用sudo又無法安裝,這時需要chown 命令賦權。

安裝完成之後,運行命令生成密鑰

gpg --gen-key

這裏寫圖片描述

紅框內都是需要鍵盤輸入的,第三個是大寫的O。
注意,再後要求輸入密碼,這個密碼需要記錄,等會mvn deploy時需要用天

之後會得到pub編號,下面紅框內的就是。
將pub編號上傳到key驗證庫

gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys B72E74B6790AC40083CCB60A0D90C381F96365D0

這裏寫圖片描述

構建到sonatype的Nexus

進入工程目錄下,運行mvn命令發佈

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密鑰密碼" 

如果另建了maven 的setting.xml文件,運行類似如下的命令

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密鑰密碼" --settings /dev_tools/apache-maven-3.3.9/conf/settings-oss.xml

如果執行失敗,並且報錯如下:

gpg: signing failed: Inappropriate ioctl for device

這說明你安裝的gpg版本較新,需要額外配置,在gpg安裝目錄(mac的是 ~/.gnupg)下建立兩個配置文件:gpg.conf、gpg-agent.conf,分別添加如下內容:
gpg.conf

use-agent
pinentry-mode loopback

gpg-agent.con

allow-loopback-pinentry

保存後再次執行上面的mvn命令,如果還有報錯,可能maven配置出了問題,檢查maven配置是否有語法錯誤,配置的賬號和密碼等有無需要轉義的特殊字符,如’&’需要轉爲’&amp;’。還需要注意的是生成密鑰和執行部署命令的必須是同一臺機器。

發佈

以上都執行成功後,在nexus中應該已經有剛纔發佈的構件了,訪問https://oss.sonatype.org/#stagingRepositories (左邊 Build Promotion –> Staging Repositories) 查看,一般是最後一個,可以按時間倒棄查看,也可以通過右上角的搜索框查找。

如果要登錄的話,賬號和jira(創建工單時)是同一個。

此時的狀態應該是open,選中構件, 點擊上方的Close->Confirm,nexus會去做一些處理以及校驗,如果校驗失敗,需要刪除構件,修改後得新上傳。

這裏寫圖片描述

如果校驗成功,選中構件,點擊上方的Release->Confirm,發佈成功後,狀態會變成Releaed, 然後自動刪除。

可以在頁面左側點擊Advanced Search 查看,如果能搜到發佈的模塊,說明已經成功了。

這裏寫圖片描述

再查看一下jira中的工單,系統多出一條評論,意思通常10分鐘內會發布到maven中央庫,但如果更新到search.maven.org需要兩個小時。

參考資料:
記一次向maven中央倉庫提交依賴包

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