1. 程式人生 > >記一次上傳jar到maven中央倉庫記錄

記一次上傳jar到maven中央倉庫記錄

最近利用工作閒暇之餘,開發了一個基於logback底層的日誌脫敏工具jar 包(歡迎大家吐槽:logback日誌脫敏工具),同事推薦上傳到maven中央倉庫,方便大家使用。於是萌生了上傳jar 包到maven中央倉庫的想法,在此分享一下將jar包釋出到Maven中央倉庫的過程以及常見錯誤的解決辦法。

一、建立jira工單

1.1、註冊Sonatype帳號:

1.2、建立提交jar 包申請工單:

登入後選擇Create Issue, 選擇Community Support - Open Source Project Repository Hosting (OSSRH)以及New Project, 其他按照自己的專案情況填寫。

必填項

Project:Community Support - Open Source Project Repository Hosting IssueType:New Project Summary:專案說明,介紹一下專案 GroupId:專案的GroupId ProjectURL:專案主頁的URL,填寫專案主頁地址 SCMurl:專案git程式碼的URL,填寫倉庫git程式碼地址 其他的選填按照自己的專案情況填寫

填寫完畢後點擊Create後,工單即建立成功,工單此時狀態為Open

1.3、工單稽核

工單建立成功幾小時內(晚上11過後回覆時間比較快,國內與美國有時差)會有工作人員稽核工單,在工單Comments區問你是否有Group Id對應的那個域名的所有權(此處為全英文回覆,如果英文不好的同事可以使用谷歌翻譯,個人感覺比百度翻譯準確太多),如果有的話就直接回複相關資訊。如果自己沒有域名的話可以掛在開源的域名(如gitee.com或github.com)下面,例如com.gitee.cqdevops,使用開源的域名有一點需要注意:Group Id必須與你的開源域名匹配,例如我的開源域名為

https://gitee.com/cqdevops,Group Id必須以com.gitee.cqdevops做為開頭,否則不能通過稽核。稽核通過就會得到Configuration has been prepared的回覆並且jira工單狀態變為Resolved,到此即可開始釋出jar 包。

二、釋出jar 包

2.1、配置maven settings.xml檔案

在settings.xml檔案servers配置下面新增server配置,使用者名稱和密碼為註冊Sonatype時的使用者名稱和密碼

<servers>
    <server>
        <id>snapshot</id>
        <username>使用者名稱</username>
        <password>密碼</password>
    </server>
    <server>
        <id>releases</id>
        <username>使用者名稱</username>
        <password>密碼</password>
    </server>
</servers>

2.2、配置專案pom.xml檔案

在pom檔案中新增如下配置

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

<name>xxxxxxxx</name>
<description>xxxxx</description>
<url>xxxx</url>

<!-- license 資訊 -->
<licenses>
    <license>
        <name>The Apache Software License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        <distribution>actable</distribution>
    </license>
</licenses>

<!-- 開發者資訊 -->
<developers>
    <developer>
        <name>xxx</name>
        <email>[email protected]</email>
        <organization>xxxx</organization>
        <url>xxxxxxxxxxxxxxxxxx</url>
    </developer>
</developers>

<!-- SCM資訊 -->
<scm>
    <connection>xxxxx</connection>                                    
    <developerConnection>xxxxx</developerConnection>
    <url>https://gitee.com/sunchenbin/mybatis-enhance</url>
    <tag>1.0</tag>
</scm>

<!-- 配置生成javadoc和sources包的外掛 -->
<build>
    <plugins>
        <!--指定編譯器版本-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <showWarnings>true</showWarnings>
            </configuration>
         </plugin>
         <!--打包原始碼-->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
                <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-javadoc-plugin</artifactId>
            <version>2.10.3</version>
            <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>
                    <id>sign-artifacts</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>sign</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<distributionManagement>
    <snapshotRepository>
        <!-- 這個id需要在setting.xml中設定  --> 
        <id>snapshot</id>
        <!-- 這裡的url就是Issue中回覆的snapshots 的repo地址--> 
        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>  
     </snapshotRepository>
     <repository>
        <id>releases</id>
        <!-- 這裡的url就是Issue中回覆的staging 的repo地址--> 
        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
      </repository>
</distributionManagement>

2.3、使用gpg生成金鑰

2.3.1、安裝gpg

<!-- windows -->
Windows系統直接去https://www.gpg4win.org/download.html下載Gpg4win
<!-- mac -->
brew install gpg
<!-- Linux -->
yum install gpg

2.3.2、檢視gpg版本

gpg --version

2.3.3、生成金鑰,提示輸入:Real name、Email address,根據提示輸入大寫O確認,然後彈出一個輸入密碼的對話方塊,請記住該密碼

gpg --gen-key

2.3.4、檢視公鑰

gpg --list-keys

2.3.5、將公鑰釋出到 gpg 金鑰伺服器(gpg --list-keys可以看到公鑰id)

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys xxxxxxxxxxxxxxxx

2.3.6、查詢公鑰是否釋出成功,如果沒有發成功再發布一次

gpg --keyserverhkp://pool.sks-keyservers.net --recv-keys xxxxxxxxxxxxxxxx

注意:有可能因為gpg版本太高,導致釋出時出現,處理方式如下:

在gpg的安裝目錄(~/.gnup)下新建兩個配置檔案: gpg.conf

use-agent
pinentry-mode loopback

gpg-agent.conf

allow-loopback-pinentry

2.4、上傳構件到 OSS 中

此時上傳的構件並未正式釋出到中央倉庫中,只是部署到 OSS 中了,過程中可能需要你手動輸入密碼

注意:使用mvn命令中預設使用settings.xml檔案中的配置,請確保上文servers配置正確配置到settings.xml檔案中

<!-- 自己配置profiles時 -->
mvn clean deploy -P releases
<!-- 使用官網parent時使用 -->
mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=金鑰密碼"

2.5、在OSS 系統中釋出構件

登入 https://oss.sonatype.org系統,帳號和密碼為註冊Sonatype時的帳號和密碼。在 Staging Repositories 中檢視剛才已上傳的jar 包,這些構件目前是放在Staging 倉庫中。此時,該構件的狀態為 Open,需要勾選它,然後點選 Close 按鈕。系統會自動驗證該構件是否滿足指定要求,當驗證完畢後,狀態會變為Closed。最後,點選 Release 按鈕來發布該構件

2.6、通知 Sonatype 構件已成功釋出

在之前建立的jira工單下面回覆“I was completed”,通知工作人員為需要釋出的構件做審批,當審批通過後,會關閉該jira工單並且會收到郵件通知。至此,就可以在maven的中央倉庫中搜索到自己釋出的構件,可以直接在pom.xml中使用了。

三、總結

第一次釋出jar 包到maven中央倉庫斷斷續續的進行了四天左右,因為是第一次釋出到中央倉庫,不清楚jira工單審批時間,耽誤一些時間,並且其間遇到了很多沒有預想到的問題。特此記錄下來,希望能給更多的人一些幫助吧。