上傳 Jar 包至 Maven 中央倉庫

一、前言

隨着時間積累,在平常寫自己的代碼過程中,會有類或者是模塊,比較通用,許多項目都能用得到。我們就可以把這些部分抽取成一個公共包,方便其他項目去使用。

本地 install 只能保存在本地中,因此將其上傳到中央倉庫中,平常就能夠輕鬆的去使用了。上傳 Jar 包的過程還算簡單,本文將記錄這一過程,系統環境爲 Windiws。

另外,請使用 windows 自帶的 CMD 作爲整篇文章的命令行工具。不要使用 Git Bash,會有坑。

二、創建工單

首先你得有個 sonatype 的賬號,點擊這裏前往註冊。最好使用 Chrome 瀏覽器進行註冊,因爲當我使用微軟 Chrome 內核的 Edge 瀏覽器註冊時,當輸入不滿足條件時,沒有彈出錯誤提示。

註冊賬戶

註冊完畢後,點擊上方導航欄藍色的創建按鈕,創建一個工單。

可以參考我的工單: https://issues.sonatype.org/browse/OSSRH-57685

問題類型: New Project

概要 / 描述 : 簡單描述下想要上傳的意圖就好

GroupId: 要上傳的 Maven 項目的 GroupId,對於我們個人用戶,一般使用 com.github.用戶名 這種命名方式。當然如果你用的是其他代碼管理平臺,用其他的也 ok,比如 com.gitee.用戶名

Project Url: 項目的主頁,例如我的是:https://github.com/jitwxs/commons

SCM Url: 項目 Clone 的地址,注意要是 http 協議的,而不是 git 協議的,例如我的是:https://github.com/jitwxs/commons.git

Already Synced to Central: 對於上傳新項目來說,選擇 No 即可。

創建工單

工單創建完畢後,會有客服發來消息,要求在 GitHub 賬戶中,創建一個指定名稱的倉庫,來驗證你對賬戶的所有權。創建完畢後,回覆創建完畢即可(創建的這個倉庫,等到流程完畢後,可以刪了)。

創建驗證倉庫

隨後客服提示已經審覈完畢,可以準備上傳了。

準備上傳

三、上傳 Jar 包

3.1 Maven 配置文件

編輯 Maven setting.xml 文件。在 <servers> 節點中加入剛剛註冊的賬戶信息。

<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>

3.2 Project Pom

3.2.1 主要信息

在 Pom 文件中添加 SCM 和描述信息,這類描述標籤,我覺得是越全越好,免得後面提交失敗。更多描述標籤,可以參考我的,是可以提交成功的。

<description>A simple and useful java commons packaging</description>

<scm>
    <connection>scm:git:https://github.com/jitwxs/commons.git</connection>
    <developerConnection>scm:git:[email protected]:jitwxs/commons.git</developerConnection>
    <url>https://github.com/jitwxs/commons</url>
</scm>

3.2.2 build 插件

在 Pom 文件中添加 build 插件,除去 maven-compiler-plugin 這個原本就需要的,需要 maven-source-pluginmaven-javadoc-pluginmaven-gpg-plugin 這三個插件。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Javadoc -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <charset>UTF-8</charset>
                <encoding>UTF-8</encoding>
                <docencoding>UTF-8</docencoding>
            </configuration>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- GPG -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <phase>verify</phase>
                    <goals>
                        <goal>sign</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3.2.3 profile

最後添加一個 profile 用於後續的上傳,注意此處 <distributionManagement> 中的 id 名,需要與 Maven setting.xml 中剛剛配置的 id 一致。

<profiles>
    <profile>
        <id>sonatype-release</id>
        <distributionManagement>
            <snapshotRepository>
                <id>sonatype-nexus-snapshots</id>
                <name>Sonatype Nexus Snapshots</name>
                <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            </snapshotRepository>
            <repository>
                <id>sonatype-nexus-staging</id>
                <name>Nexus Release Repository</name>
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
    </profile>
</profiles>

3.3 Gpg 加密

上傳 jar 包過程,需要使用祕鑰,對於 Windwos 系統,使用 Gpg4win 即可,點擊這裏下載。一路傻瓜式安裝即可,唯一要注意的是安裝組件那邊,其實我們只使用了 GunPG,因此其他可選項都可以不安裝。

Gpg4win

安裝完畢後,執行命令 gpg --version 驗證是否安裝成功。

驗證是否安裝成功

執行命令 gpg --gen-key ,提示填寫 Real nameEmail address,自行填寫即可,輸入字母 O 後生成祕鑰。

生成祕鑰

執行命令 gpg --list-keys 查看所有已經創建的祕鑰信息。

查看祕鑰

上圖紅框處爲剛剛生成的祕鑰的公鑰,複製下來,並將其上傳至 PGP 祕鑰服務器。

gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 紅框內容

上傳完畢後,執行如下命令,查看是否上傳成功。

gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 紅框內容

驗證是否上傳成功

四、發佈

4.1 Deploy

進入Maven項目跟目錄,執行 mvn 發佈命令(-P 後跟的是 profile 的 id 名),會彈窗要求輸入密碼,輸入 sonatype 密碼即可。

mvn clean deploy -DskipTests -P sonatype-release

命令行上傳

此時會拋一些錯誤,例如我這邊是 Javadoc 寫的不規範,按提示將錯誤處理了即可。

錯誤提示

但是,我更推薦直接使用 IDEA 操作,勾選 Profike 後,同時選中 clean、deploy,右鍵 run 即可。使用這種方式,都沒有讓我輸入密碼。

IDEA 上傳

4.2 Repository Manager

打開 Nexus Repository Manager,使用 sonatype 賬戶登錄即可。點擊左側的 Staging Repositories,可以找到我們剛剛 deploy 的項目,目前處理 open 狀態。

Staging Repositories

網上幾乎所有的相關文章,對於 Repository Manager 相關的描述,都只是說要怎麼做,卻不告訴大家爲什麼要這麼做,導致讓新手操作起來很暈。

  1. 其實這邊的流程很簡單,當我們從本地 deploy 到遠程後,它處於暫存區當中,類似於 git 暫存區的概念,即上圖中的 Open。在這個狀態下,你可以不停地重新 deploy,新的 deploy 內容會覆蓋掉老的。

  2. 當你覺得修改的差不多了,可以正式提交了。就需要點擊上方的 Close 按鈕,點擊 Close 後,系統會對你提交的內容進行一系列的檢測。如果沒有通過檢測,你需要點擊 Drop 按鈕,將本次的 deploy 給刪除掉,然後重新 deploy,回到上一步的流程。

  3. 如果已經通過了檢測,點擊上方的 Release 按鈕,就會將項目正式的提交到中央倉庫中。

現在開始正式操作,點擊上方的 Close 按鈕,準備提交。彈窗中的描述隨便填寫即可,比如我填寫的是本次發佈的版本號 1.3。

Close Project

點擊上方的 Refresh 按鈕刷新一下,在 Activity 標籤頁,可以看到當前的檢測進度。

當所有檢測項均爲 Passed 後,就可以進入下一步了。如果有某一項沒有通過,先 Drop 掉本次提交,按照錯誤提示修改完代碼後,重新走一遍流程即可。

Check Pass

點擊上方的 Release 按鈕,正式提交到中央倉庫。

Release Project

點擊上方的 Refresh 按鈕刷新一下,在 Activity 標籤頁,可以看到當前的上傳進度。當上傳完畢後,內容會自動爲空。此時在左側的搜索框搜索項目,右側能夠顯示出來,即表示上傳成功。

Search Project

4.3 回覆工單

對於項目的首次 Release,需要回復下工單,告訴客服已經發布了。後續的提交,就不再需要回復工單,這個流程了。

五、常見問題

5.1 上傳的項目有 Bug 怎麼辦,我能刪掉重傳嗎?

官方表示不支持這樣的操作,如果傳錯了,那麼就再發佈一個新的 Release 版本即可。如果你還是想知道怎麼刪除掉,可以去創建一個工單,去碰碰運氣吧。

5.2 我的項目,要過多久才能夠上傳完畢?

如果你的 Maven 使用官方默認源的話,大概上傳後 10 分鐘左右就可以使用了,驗證方法是匿名方式在 Nexus Repository Manager 中進行搜索,能搜索出來就可以了。

如果你使用的是阿里的源,那麼大概要 30 分鐘,也許更久,這依賴於阿里的同步速度。

如果你想在 mvnrepository 上搜索出來,得要好幾天,佛系點吧。

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