發佈自己的jar包到Maven官方倉庫

一、申請GroupId

我們知道,一個maven座標由groupIdartifactIdversion組成,後兩者可以在pom中調整,而可以用在中央倉庫的 groupId需要申請。由於 Maven 中央倉庫由 sonatype 公司進行運營,所以我們首先需要註冊一個sonatype賬號,通過該賬號去申請一個 groupId

1、註冊

註冊沒什麼好說的,按順序填就行,需要注意用戶名最好不要用中文。

image-20220215144939190

2、申請

這裏的操作跟GitHub很像,新增相當於提出一個issues:

image-20220215150018531

然後填寫信息:

image-20220215150401093

我們從上往下看:

  1. 摘要:簡單寫點;
  2. Group Id:你想要申請的 Group Id,可以是:
    • 你的 GitHub 或者 Gitee 的 GitPage地址倒序:我的個人主頁是createsequence.github.io,這裏就可以填io.github.createsequence
    • 你的域名倒序:比如我的域名是xiajibagao.top,這裏就是 top.xiajibagao
  3. Project URL:項目的倉庫地址;
  4. SCM url:項目 clone 的地址;
  5. Username:即你的 sonatype 賬戶名稱;

然後點擊新建就會創建一個編號爲OSSRH-xxx的申請/issues。

3、驗證

當你的申請被受理後,工作人員會給你發郵件,讓你證明你申請的 Group Id 對應的域名是你自己的:

image-20220215154451409

這裏根據 URL 是個人域名還是託管平臺的會有兩種情況:

  • 託管平臺:會讓你根據在倉庫中創建一個指定名字的倉庫;
  • 個人域名:會讓你在域名的 DNS 解析記錄下添加一個指定內容的 text 記錄;

此時,申請的狀態會變爲是 Waiting for Response,當你完成操作後,需要手動將申請的狀態改爲 Open,然後工作人員就會再一次審批。

到此爲止,等待審批完成 Group Id 下發即可。

二、申請 gpg 簽名

爲了防止任何人都可以拿着你的賬號密碼去部署 jar 包,打包和發佈代碼前需要先根據 gpg 密匙進行加密。因此我們需要先獲取一個 gpg 簽名。

首先,window 電腦可以直接下載,Linux 系統用命令行 install gpg 即可。後續操作都可在命令行進行。

1.生成簽名

安裝完畢後執行gpg --version查看是否成功安裝,然後使用 gpg --gen-key命令生成簽名,然後會讓你輸入郵箱和密碼,按流程走下來即可。

生成密匙後,可以使用 gpg --list-keys查看已生成的密匙對應的簽名:

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
C:/Users/huang/AppData/Roaming/gnupg/pubring.kbx
---------------------------------------------
pub   rsa3072 2021-07-06 [SC]
      9E02D0E104E3D3517B5B0E54DF7B4B4D1A32FB02 # 這個就是簽名
uid           [ultimate] username <[email protected]>

2.上傳公鑰到服務器

使用 gpg --keyserver hkp://URL --send-keys 簽名上傳公鑰,然後使用 gpg --keyserver hkp://URL --recv-keys 簽名查看是否上傳成功。

URL 可以用:

  • pool.sks-keyservers.net:這個不太穩定,容易出錯;
  • keyserver.ubuntu.com:11371:這個相對穩定,推薦

3.在其他設備導入祕鑰

如果更換的設備,需要在其他設備繼續用這個祕鑰,可以參考:發佈項目到Maven中央倉庫(換機器後)

三、Maven配置

原則上,拿着 gpg 簽名,並且申請完以後就可以拿着 Group Id 去上傳項目了,但是還需要先把 Maven 配置好。

1、配置 Maven 服務

首先,將 sonatype 賬號密碼,將其添加到setting.xml<servers></servers>配置中:

<!-- Maven公共倉庫 -->
<server>
    <id>maven-public</id>
    <username>username</username>
    <password>password</password>
</server>

2、項目信息

然後,需要在項目的 pom.xml文件中配置基本信息,這些信息會在上傳到中央倉庫後在 jar 包頁面展示:

<!-- 許可證類型,一般與項目倉庫保持一致 -->
<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>

<!-- 開發者信息 -->
<developers>
    <developer>
        <name>Createsequence</name>
        <email>[email protected]</email>
        <organization>xiajibagao</organization>
    </developer>
</developers>

<!-- groupId, artifactid, version -->
<groupId>top.xiajibagao</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>1.0.0</version>
<name>mybatis-plus-join</name>
<description>mybatis plus join extend</description>
<packaging>jar</packaging>

3、打包插件

接着,爲了可以正常部署,需要在 pom.xml 中添加以下四個插件:

<!-- 生成javadoc -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <source>${java.version}</source>
        <additionalJOption>-Xdoclint:none</additionalJOption>
        <failOnError>false</failOnError>
    </configuration>
</plugin>

<!-- 打包resources -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<!-- 打包源碼 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <showWarnings>true</showWarnings>
    </configuration>
</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>

注意:

maven-javadoc-plugin插件會檢查 javadoc 格式是否嚴格符合標準,比如 <p>標籤是否閉合之類的,如果註釋很多不標準的話可以在插件上添加配置跳過檢查:

<configuration>
    <!-- 禁用doclint,不嚴格檢查 -->
    <additionalJOption>-Xdoclint:none</additionalJOption>
    <!-- 文檔解析出錯時仍然繼續 -->
    <failOnError>false</failOnError>
</configuration>

4、發佈到OSS

最後,需要在 pom.xml 中添加部署配置

<distributionManagement>
    <snapshotRepository>
        <id>maven-public</id> <!-- 此處id與setting.xml中的服務id保持一致 -->
        <name>oss Snapshots Repository</name>
        <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
        <id>maven-public</id> <!-- 此處id與setting.xml中的服務id保持一致 -->
        <name>oss Staging Repository</name>
        <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

然後執行 mvn clean deploy命令,會出現彈框讓你輸入之前在 gpg 創建簽名時輸入的密碼,完成後等待上傳完畢。

注意:

gpg 在命令行中確認沒問題,但是實際上使用mvn命令部署時仍然會出現找不到命令的問題,因此若出現找不到 gpg 命令之類的問題需要直接在<profiles></profiles>中配置腳本路徑:

<!-- gpg -->
<profile>
    <id>maven-public</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <gpg.executable>C:\programs\GnuPG\bin\gpg</gpg.executable>
        <gpg.passphrase>you pass</gpg.passphrase>
    </properties>
</profile>

四、同步到 Maven 中央倉庫

當執行 mvn clean deploy後,項目會成功上傳的遠程倉庫,此時訪問https://s01.oss.sonatype.org/#stagingRepositories

注意,有些教程說的是https://oss.sonatype.org/#stagingRepositories,實際上 2021-02-25 以後的新用戶使用的倉庫都換爲了 s01 這個地址。

然後:

  1. 點擊 Staging Repositories查看待處理的 jar 包;

  2. 選擇需要發佈的 jar 包;

  3. 點擊 Close進行檢查;image-20220216091800813

  4. 系統自動檢查是否可發佈,若有問題可以在 Activity 中查看;

  5. 校驗完成後,點擊 Release即可發佈到中央倉庫,一般首次發佈需要等一天左右,後續再發布就只要半小時即可。

    image-20220216092214049

  6. 成功發佈後,jar 包座標可在中央倉庫中查到,可以在 pom 中引用了。

    比如我這個示例項目:mybaits-plus-join,對應 Maven 座標即爲:

    <dependency>
        <groupId>top.xiajibagao</groupId>
        <artifactId>mybatis-plus-join</artifactId>
        <version>2.0.0</version>
    </dependency>
    

注意:

有時候校驗的時候會卡在 Evaluating:Signature Validation這一步,這個時候需要注意一下上面獲取到的 gpg 簽名的公鑰是否成功上傳,或者是否在 pom.xml 中把 gpg 插件給關了,這兩個問題都會導致這一步校驗不通過。

參考

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