我把自己的java庫釋出到了maven中央倉庫,從此可以像Jackson、Spring的jar一樣使用它了

程式設計師欣宸發表於2022-01-19

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

關於maven中央倉庫

  • 作為一個java程式設計師,對maven中央倉庫https://mvnrepository.com/自然是非常熟悉的,畢竟我們們的應用依賴的jar大部分都來自此處,如果您想把自己開發的java庫也託管在上面,讓大家像使用Jackson、Spring那樣輕鬆簡單的使用您的jar,就請隨本文一起操作吧;

  • 先看看效果,下圖是我釋出的java庫在中央倉庫的搜尋結果:

在這裡插入圖片描述

前提條件

  • 由於sonatype官方會要求您在github建立一個倉庫(倉庫名由sonatype官方指定,以此驗證您是否有github操作許可權),因此請確保您自己有github賬號,並且可以建立倉庫

本篇概覽

  • 梳理一下,按照以下步驟將自己的java庫釋出到maven中央倉庫:

在這裡插入圖片描述

  • 文末還會對曾經踩過的小坑做了總結,希望能幫助讀者們提前避開

  • 看起來略有些繁瑣,但其實很簡單,接下來開始吧

準備工作

  • 首先請把您的java工程準備好,我用的是一個非常普通的maven工程,名為opencv-linux,github倉庫地址https://github.com/zq2599/opencv-client

  • 本次涉及的軟體資訊如下:

  1. 作業系統:macOS Monterey(12.0.1)
  2. JDK:1.8.0_312
  3. Maven:3.8.3

1. 註冊帳號

在這裡插入圖片描述

2. 建立問題(issue)

  • 點選上圖紅框中的新建開始建立issue,如下圖,專案選擇Community Support,問題型別是New Project

在這裡插入圖片描述

  • 接下來填寫專案相關的資訊,請注意Project URL裡面是您自己的工程對應的github倉庫地址:

在這裡插入圖片描述

  • 提交後等待幾分鐘,註冊賬號時填寫的郵箱會收到一封郵件,要求你建立一個倉庫,以此來證明之前提交的github帳號屬於你自己:

在這裡插入圖片描述

  • 上述內容在剛才新建的issue頁面也能看到,如下圖,即sonatype的評論:

3. 建立sonatype指定的倉庫

在這裡插入圖片描述

4. 在issue上進行回覆

  • 開啟issuse,增加一個評論,如下圖:

在這裡插入圖片描述

  • 不久後(我這邊是十多分鐘),就會收到一條新的評論,通知你可以去做釋出了,並給你了snapshot和release的釋出地址:

在這裡插入圖片描述

5. 安裝GPG

  • 後面的操作中,在將jar釋出到中央倉庫時,要用GPG工具對上傳的資料進行簽名,因此接下來要準備好GPG祕鑰

  • 先安裝GPG軟體,開啟網站:https://www.gnupg.org/download/

  • 下載安裝檔案,請選擇適合您的作業系統的,我的選擇如下圖紅框:

在這裡插入圖片描述

  • 安裝GPG

6. 生成祕鑰並上傳

  • 安裝完成後,在控制檯執行gpg2 --gen-key開始建立祕鑰

  • 根據提示輸入賬號、郵箱、密碼等:

GnuPG needs to construct a user ID to identify your key.

Real name: zq2599
Email address: zq2599@gmail.com
You selected this USER-ID:
    "zq2599 <zq2599@gmail.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
  • 操作完成後得到如下資訊:
gpg: key 11027EJIHGFEDCBA marked as ultimately trusted
gpg: directory '/Users/will/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/will/.gnupg/openpgp-revocs.d/561AEE4EA92EE3E4C389941811027E9876543210.rev'
public and secret key created and signed.

pub   rsa3072 2021-11-10 [SC] [expires: 2023-11-10]
      561AEE4EA92EE3E4C389941811027E9876543210
uid                      zq2599 <zq2599@gmail.com>
sub   rsa3072 2021-11-10 [E] [expires: 2023-11-10]
  • 如上所示,得到了pub key等於561AEE4EA92EE3E4C389941811027E9876543210

  • 執行以下命令,將祕鑰同步到雲端,注意keyserver,網上可以搜到很多個,個人實際操作中,下面這個是可以成功的:

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

7. maven全域性配置

  • 試想把sonatype的賬號密碼寫在專案的pom.xml中,再上傳到github讓所有人都看到?相信您一定不願意這樣,所以還是放在maven的全域性配置中比較安全,畢竟是儲存在自己的電腦上

  • 開啟maven的配置檔案settings.xml,在servers下面增加一個server節點,這是個賬號密碼的配置,對應的是https://issues.sonatype.org的賬號密碼:

<server>
	<id>ossrh</id>
    <username>zq2599</username>
    <password>12345678</password>
</server>
  • profiles下增加一個profile節點,gpg.passphrase的內容是剛才建立gpg祕鑰時輸入的密碼:
<profile>
	<id>gpg</id>
    <properties>
    <!-- 由於我的電腦裝的gpg2,所以需要指定執行gpg2,否則會報錯 -->
    <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>abcdefgh</gpg.passphrase>
    </properties>
</profile>
  • 涉及到賬號密碼的全域性配置就完成了,接下來開啟您的java工程,我們們去修改pom.xml的配置

8. maven專案配置

  • 首先要搞清楚釋出倉庫的地址在哪,官方指導如下,給出了snapshot和release的倉庫地址:

在這裡插入圖片描述

  • 以下是java工程的pom.xml檔案,需重點關注的地方都有中文註釋,請不要漏掉帶序號的註釋,這些都是最關鍵的配置,這種註釋共11個:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>io.github.zq2599</groupId>
    <artifactId>opencv-linux</artifactId>
    <version>0.0.3</version>
    <name>opencv-linux</name>
    <description>opencv-linux</description>
    <!-- 1. url必須要有,不然遠端提交時會返回錯誤 -->
    <url>https://github.com/zq2599/opencv-client</url>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <packaging>jar</packaging>

    <!-- 2. 開源證照 -->
    <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>
    <!-- 3. 原始碼倉庫資訊 -->
    <scm>
        <connection>scm:git:git@github.com:zq2599/opencv-client.git</connection>
        <developerConnection>scm:git:git@github.com:zq2599/opencv-client.git</developerConnection>
        <url>https://github.com/zq2599/opencv-client/tree/main</url>
    </scm>
    <!-- 4. 開發人員資訊 -->
    <developers>
        <developer>
            <name>zq2599</name>
            <email>zq2599@gmail.com</email>
            <organization>https://github.com/zq2599</organization>
            <timezone>+8</timezone>
        </developer>
    </developers>
    <!-- 5. 上傳的倉庫地址,以及使用哪個賬號密碼配置 -->
    <distributionManagement>
        <snapshotRepository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>
        <repository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
    </dependencies>

    <build>
    	<!-- 配置好每個外掛的屬性 -->
        <pluginManagement>
            <plugins>
            	<!-- 6. 上傳到sonatype的外掛 -->
                <plugin>
                    <groupId>org.sonatype.plugins</groupId>
                    <artifactId>nexus-staging-maven-plugin</artifactId>
                    <version>1.6.7</version>
                    <extensions>true</extensions>
                    <configuration>
                        <!-- 這裡的id必須要和全域性配置中的server一致 -->
                        <serverId>ossrh</serverId>
                        <!-- 這個地址,一定要和issue的評論中給出的地址一致! -->
                        <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                        <!-- 如果希望釋出後自動執行close和release操作,此處可以調整為true -->
                        <autoReleaseAfterClose>false</autoReleaseAfterClose>
                    </configuration>
                </plugin>

				<!-- 7. 上傳原始碼的外掛 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>3.1.0</version>
                    <inherited>true</inherited>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <excludeResources>true</excludeResources>
                        <useDefaultExcludes>true</useDefaultExcludes>
                    </configuration>
                </plugin>

				<!-- 8. 生成doc文件的外掛 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>3.0.0</version>
                    <inherited>true</inherited>
                    <executions>
                        <execution>
                            <id>bundle-sources</id>
                            <phase>package</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <maxmemory>1024</maxmemory>
                        <encoding>UTF-8</encoding>
                        <show>protected</show>
                        <notree>true</notree>

                        <!-- Avoid running into Java 8's very restrictive doclint issues -->
                        <failOnError>false</failOnError>
                        <doclint>none</doclint>
                    </configuration>
                </plugin>

				<!-- 9. 編譯構建maven工程的外掛 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

		<!-- 10. 確定要使用哪些外掛 -->
        <plugins>
            <plugin>
                <groupId>org.sonatype.plugins</groupId>
                <artifactId>nexus-staging-maven-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- 11. 生成簽名,確定使用那個gpg祕鑰 -->
                    <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>
        </profile>
    </profiles>

</project>

9. 編譯、構建、上傳

  • 編譯構建上傳其實很簡單,下面一行命令搞定(進入pom.xml所在目錄下執行以下命令):
mvn clean javadoc:jar deploy -P release
  • 構建期間會彈出視窗讓你輸入密碼,請輸入建立GPG祕鑰時設定的密碼:

在這裡插入圖片描述

  • 構建和上傳成功後,控制檯輸出如下(截選):
...
[INFO] Installing /Users/zhaoqin/github/blog_demos/opencv-linux/target/opencv-linux-0.0.3-sources.jar.asc to /Users/zhaoqin/github/blog_demos/opencv-linux/target/nexus-staging/staging/543da2cd9af848/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc
[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "543da2cd9abc12"
[INFO]  * Created staging repository with ID "iogithubzq2599-1008".
[INFO]  * Staging repository at https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008
[INFO]  * Uploading locally staged artifacts to profile io.github.zq2599
Uploading to ossrh: 
...
https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc (659 B at 1.2 kB/s)
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "iogithubzq2599-1008".

Waiting for operation to complete...
...
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  27.199 s
[INFO] Finished at: 2021-11-12T08:08:37+08:00
  • 記住上述資訊中展示的iogithubzq2599-1008,這是本次上傳操作在倉庫中對應的ID

10. 登入指定的倉庫網址

  • 接下來登入Nexus網站,具體的網址一定要看issue的評論,如下圖紅框,我這裡要登入的是:https://s01.oss.sonatype.org

在這裡插入圖片描述

在這裡插入圖片描述

11. 釋出

  • 登入成功後,點選下圖紅框中的Staging Repositories

在這裡插入圖片描述

  • 如下圖,找到合適的記錄(我這裡是iogithubzq2599-1008),點選紅框3中的Release進行釋出,如果狀態不是closed,就要展開底部的Activity檢視發生了什麼異常:

在這裡插入圖片描述

  • 操作成功,如下圖所示:

在這裡插入圖片描述

12. issue收到評論,提示完成時間

  • 靜候十多分鐘,issue上收到一條評論,提示同步操作已啟用,三十分鐘內同步到https://repo1.maven.org/,四小時內同步到https://search.maven.org:

在這裡插入圖片描述

  • 網上有文章提到第一次釋出要在issuse上評論,才會觸發同步操作,我這裡沒有遇到(正打算評論呢,發現已經開始同步了)

13. 三十分鐘內同步到https://repo1.maven.org

  • 靜候三十分鐘,可以在網站https://repo1.maven.org上看到上傳的工程相關檔案了,如下圖:

在這裡插入圖片描述

14. 四小時內同步到https://search.maven.org

在這裡插入圖片描述

15. 二十四小時內同步到https://mvnrepository.com/

  • 同步到https://mvnrepository.com的時間並不是精確的二十四小時,而是我時隔二十四左右在此網站上可以搜尋到自己的庫:

在這裡插入圖片描述

  • 至此,自己的java庫已成功釋出到maven中央倉庫,可以像Jackson、Spring庫那樣使用這個庫了,用法就是新增這個依賴:
<dependency>
    <groupId>io.github.zq2599</groupId>
    <artifactId>opencv-linux</artifactId>
    <version>0.0.3</version>
</dependency>

踩坑記錄

  • 現在已完成了所有的操作,回顧一下,整個過程其實相對比較順利,只遇到了三個小坑需要您注意:
  1. 同步gpg祕鑰到雲端的時候,網上有文章提到用hkp://subkeys.pgp.net,我在使用該地址的時候一直在報錯,改為hkp://keyserver.ubuntu.com:11371之後上傳成功
  2. maven工程的pom.xml檔案中,一定要有url節點,如下圖,否則會在同步到雲端的時候報錯Project url missing

在這裡插入圖片描述

  1. 釋出的操作是在網頁上進行的,網上有的文章提到網站是https://oss.sonatype.org,最初我也開啟了該網頁並嘗試登入,可惜始終登入失敗,最終,在issue的評論上發現如下圖紅框,要登入的網站是https://s01.oss.sonatype.org

在這裡插入圖片描述

  • 至此,所有操作都已完成,如果您正在將自己的java庫釋出到maven中央倉庫,希望本文能給您一些參考

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章