將你自己的項目發布到maven中央倉庫


為什么寫這篇文章

現在OkHttp很火,研究學習了一下,鋪天蓋地的教程和通用工具都是Android用的,封裝了很多Android的組件在里邊.但是OkHttp不是一個安卓庫啊,它是java庫,所有基於JVM的語言都可以用.
所以自己寫了個OkHttp通用簡單封裝並放到了github,這是本人第一個開源項目,有點小興奮呢.但是只是開源,別人想使用也麻煩,還要下載下來自己編譯,然后就想到了把它提交到maven中央倉庫.但是沒有提交過啊,各種搜索折騰了一天,終於成功了.
這篇文章大概介紹一下如何將自己的項目發布到maven中央倉庫及我滾過的坑(可能大家會覺得可笑,想笑就笑吧,反正我也看不見o(∩_∩)o )

什么是maven中央倉庫

偷個懶,下面的內容摘抄自 發布項目到maven中央倉庫

maven是java世界最流行的構建工具,構建內容囊括了一個java項目的整個生命周期。其中最重要的功能就是依賴管理,maven通過一個類似雲的ftp站點統一管理所有java 的jar文件,同時給每個文件的每個版本一個統一的唯一坐標。開發人員通過檢索配置這些坐標,選擇自己需要的構件搭建自己的項目環境。因此,通過一個叫做pom的描述文件,我們就可以在任何平台搭建好項目運行所需要的環境。方便了協作和分享代碼。

而那個類似雲的ftp站點就是maven中央倉庫。由於一些不可抗拒因素,我們對於中央倉庫的訪問速度比較慢。因此在平時工作環境中,我們往往都是使用一些鏡像站點,如阿里雲和開源中國的倉庫鏡像。同時由於公司里的商業代碼不可發布到公開站點,我們也會在局域網內搭建私服。但是無論是鏡像還是私服,都像是緩存,雖然提高了下載速度,但是最終,所有的jar都來自中央倉庫。因此,如果我們將項目發布到了maven 中央倉庫中,那么在所有基於maven或者gradle等的項目里都可以依賴下載你的構件。真正做到了一次發布,處處可用。

發布到中央倉庫的好處

偷個懶,下面的內容摘抄自 發布項目到maven中央倉庫

首先,作為一個java從業者,對於天天都在用的東西,做一個深入的了解,發布一個項目到中央倉庫可以自我滿足。作為我來講,我發布了一個自己的項目,開始有了利用下班時間好好寫點開源代碼學習和裝逼的沖動。

再者,作為一個經驗豐富的java開發工程師,我們在日常工作中總會積攢下自己使用得很順手的一些輪子或者一些通用的基礎類。如果我們整理好,並持續維護,發布到了中央倉庫之后,就可以避免很多重復性的工作。而且也避免了很多沖突:我現在的公司里,每個項目的dubbo調用接口都會自己定義一個Response和Request類。同一類型的重復定義,跟cpp的多根繼承一樣煩。這樣的結果導致了沒法統一處理各個系統的調用返回值。既不夠優雅,也顯得重復。如果我們把這些基礎的東西發布到了中央倉庫,就只需要引用一下了。當然這種情況一般是發布到私服比較好,我只是舉個例子。具體的大家自行體會。

發布過程

在發布前,您需要有自己的項目主頁並開源的代碼,您可以使用GitHub或者碼雲,下面的內容以GitHub為例

注冊 sonatype的Jira 帳號

注冊地址: https://issues.sonatype.org/secure/Signup!default.jspa
注冊很簡單,重要的是郵箱地址一定要正確,issue有任何變動都會通過郵件通知.

這里要着重說明一下,也是我滾過的坑: Username 字段一定要使用英文+數字,一定不要使用中文!!!否則官方無法分配權限給你,或者會讓你另行注冊.
因為這個Username會成為這個Jira和提交maven項目的OSS的帳號,雖然用中文登錄啥的沒問題,但提交的時候就有問題了,我折騰了N個小時,最后又求助官方人員才解決.
我當時發了一個issue,就叫 issues1吧,當時官方人員讓我修改GroupId,修改后我回復修改完成,等了好多個小時都沒回應.然后我又提交了一個issue2,內容與issue1一毛一樣,很快就有官方人員說OK了.
沒過幾分鍾issue1也有官方人員回復了(不是一個人),說我的帳號XX(中文) 不行,讓我重新注冊一個帳號再回復,他幫我弄.
由於當時issue2已經有官方人員回復OK了,我就在issue1里回復說我在另一個issue里已經解決.然后我就很歡喜的去提交,折騰了好久都沒提交上,一直說沒有權限...但是當時我用那個帳號登錄OSS是可以登錄的,就是提交不了.
折騰了幾個小時之后,很無奈的去issue2里求助官方人員,然后在issue1里讓我重新注冊的兄弟在issue2里說是因為我的帳號是中文,無法分配權限,讓我重新注冊一個再在issue2里回復,他幫我配權限...
重新注冊了一個帳號之后,用新的帳號提交,OK了...

登錄Jira

注冊完成后就登錄: https://issues.sonatype.org/login.jsp

創建一個 Issue

創建地址: https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

這個地址已經選擇好了項目和類型,直接填就行,當然,如果你要通過【Create】按鈕創建
Project選擇【Community Support - Open Source Project Repository Hosting (OSSRH)】
Issue Type:選擇【New Project】
Summary和Description :自己填,注意要用E文
Group Id::這個必須要注意,如果你用的是GitHub, 一定要是 com.github.你的github用戶名, 例如我的項目地址是: https://github.com/KeRan213539/CommonOkHttp, 那我的 groupId就是com.github.KeRan213539,當然也可以使用 GitHub的Page的域名 io.github.你的github用戶名. 如果你有自己的域名和項目地址也可以,官方人員會詢問你是否有這個域名的所有權.在你項目的pom里一定要使用這個groupId,最好包路徑也使用
Project URL: 是你的項目地址
SCM url: 是你的項目git地址
Username(s): 可以不用填,這是能輔助你提交項目的合作人的帳號,前提是他也得在這個Jira注冊
其他使用默認值就行了

創建好Issue后就等待官方回復吧.通常如果在晚上22點23點的話回復會比較快,運氣好幾分鍾就有回復了
當看到回復類似 com.github.xxx has been prepared, now user(s) xxx can:Deploy snapshot artifacts into repository ... 說明OK了,可以提交了

使用 GPG 生成密鑰對

在等待Issue的時候可以先把密鑰搞好
Windows 系統,可以下載 Gpg4win 軟件來生成密鑰對。下載地址:https://www.gpg4win.org/download.html
下載的時候有個坑,會彈出一個捐助頁面,然后沒有下載的地方,也沒有自動開始下載.感覺好像不捐助就不能下載一樣.其實在下載頁面下面有個All Downloads,里面有個連接 files.gpg4win.org,在這里找到與下載頁面上的最新版相同的版本號下載即可
安裝過程中在選擇組件的時候,除了默認必須安裝的,其他取消即可
安裝完成后,打開CMD

查看是否安裝成功
gpg --version


生成密鑰對
gpg --gen-key
Real name: 名字(E文)
Email address: 郵箱
You selected this USER-ID:
"xxxxxx@qq.com"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
之后往下,會讓你輸入用戶名和郵箱,還有一個Passphase(輸入兩次),相當於密鑰庫密碼,不要忘記。


查看公鑰
gpg --list-keys
pub rsa2048 2017-12-16 [SC] [expires: 2019-12-16]
9DF36BF5DFB87B6F04DBCE3D63EC6544BEE6682D
uid [ultimate] xxxxxx@qq.com
sub rsa2048 2017-12-16 [E] [expires: 2019-12-16]

其中 9DF36BF5DFB87B6F04DBCE3D63EC6544BEE6682D 就是公鑰的指紋


將公鑰發布到 PGP 密鑰服務器
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 你的公鑰指紋


查詢公鑰是否發布成功
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 你的公鑰指紋

修改Maven配制

如果你的Issue通過了,那么可以開始提交項目了.

修改maven全局配制文件 settings.xml,在maven安裝目錄的conf文件夾下

 

<servers>
    <server>
        <id>oss</id>
        <username>用戶名</username>
        <password>密碼</password>
    </server>
</servers>

  

 

這里的 id 是要在 pom.xml 里面使用的,用戶名和密碼就是Jira的帳號密碼

pom.xml

<project>
    ...
    <name>dexcoder-assistant</name>
    <description>dexcoder-assistant is a rapid development kit.</description>
    <url>http://www.dexcoder.com/</url>
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</naurl
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        </license>
    </licenses>
    <developers>
        <developer>
            <name>selfly</name>
            <email>selfly@foxmail.com</email>
        </developer>
    </developers>
    <scm>
        <connection>scm:git:git@github.com:selfly/dexcoder-assistant.git</connection>
        <developerConnection>scm:git:git@github.com:selfly/dexcoder-assistant.git</developerConnection>
        <url>git@github.com:selfly/dexcoder-assistant.git</url>
    </scm>
    
    <profiles>
        <profile>
            <id>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>
                        <configuration>
                            <show>private</show>
                            <nohelp>true</nohelp>
                                    <charset>UTF-8</charset>
                <encoding>UTF-8</encoding>
                <docencoding>UTF-8</docencoding>
                <additionalparam>-Xdoclint:none</additionalparam>  <!-- TODO 臨時解決不規范的javadoc生成報錯,后面要規范化后把這行去掉 -->
            </configuration>
                        <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.5</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>
    ...
</project>

  

pom.xml 中必須包括:name、description、url、licenses、developers、scm 等基本信息,使用了 Maven 的 profile 功能,只有在 release 的時候才創建源碼包、文檔包、使用 GPG 進行數字簽名。
此外,snapshotRepository 與 repository 中的 id 一定要與 setting.xml 中 server 的 id 保持一致。
如果是多模塊項目的話,只需要在父 pom.xml 中聲明這些,子 pom.xml 中只需要修改相應的一些信息,如 name 標簽。
由於我使用的是jdk8,對doc的格式要求更嚴,不標准的doc注釋會報錯,這時候可以通過在doc插件中配制additionalparam參數,上面代碼里已經配過了.但這只是臨時解決方案,還是盡量使用標准的doc注釋吧.

提交項目到OSS

maven配制修改完成后,就可以提交項目了,使用命令:

mvn clean deploy -P release

  

當執行以上 Maven 命令時,會自動彈出一個對話框,需要輸入上面提到的 Passphase,它就是剛才設置的 GPG 密鑰庫的密碼。
注意:此時上傳的構件並未正式發布到中央倉庫中,只是部署到 OSS 中了,下面才是真正的發布。


執行上面的命令的過程中,可能會找不到gpg.exe, 檢查環境變量,發現環境變量中已經配制了gpg.exe所在的路徑,但是還是報錯... 如何解決? setting.xml中加入:

<profile>
  <id>release</id>
  <properties>
    <gpg.executable>D:/Program Files (x86)/GnuPG/bin/gpg.exe</gpg.executable>
    <gpg.passphrase>上面提到的 Passphase</gpg.passphrase>
  </properties>
</profile>

  

注意 ID要與pom.xml里的發布的 profile 的ID對應
其中<gpg.executable>為你的gpg.exe的完整路徑
<gpg.passphrase> 為上面提到的 Passphase,這樣就不用在每次發布的時候都輸入密碼了,但是我發現即便有這個,有時候(只是有時,不是每次)還是要讓輸入密碼,暫時不清楚是什么問題.
上面這2個配制也可以配制到pom.xml的gpg插件的<configuration>中,去掉<gpg.>就行,當然密碼最好還是不要放在pom.xml里,因為如果你的代碼開源的話,密碼也一起開源了...


如何發布快照版本?
在pom.xml中的項目版本號后面加上 -SNAPSHOT 就行
快照版到這里就發布好了,不需要執行下面的關閉、發布構建步驟,構建列表里也找不到快照版的構建,快照版發布后就可以直接引用了

在 OSS中發布

使用 Jira 賬號登錄 https://oss.sonatype.org,在 Staging Repositories 中查看剛才已上傳的構件。
一般發布的構件不多,可以直接滾動條拉到最后就能看到自己的構件,或者更改時間排序,也可進行模糊查詢定位到自己的構件
找到自己的構建后選中,並點擊上方的 【Close】按鈕關閉構建,這個過程有點慢,稍等幾分鍾
刷新頁面,發現關閉成功后,再次選中自己的構建,點擊上方的【Release】發布構建.

通知Sonatype 已經成功發布

在Issue通過審核的官方回復中,通常會讓你在發布成功后再次回復告知他們,在剛才那個Issue中回復已經成功發布,官方會回復你大概需要等多久才能在中央倉庫中找到你的項目(10分鍾左右)以及要多久才能在搜索中搜到(2個小時左右)

以后的提交過程

第一次提交才這么麻煩,以后提交只用重復maven發布,OSS中Close,Release的過程就可以了,當然需要等待的時間還是10分鍾和2小時.
如果要發布新的項目,在使用相同GroupId的情況下,與上面的過程一樣.只有使用不同的GroupId的時候,才會需要再去提交Issue申請.
當然如果你沒有換電腦的話 GPG 的過程只需要一次就行

結束

到此發布過程就結束了.本文參考了以下文章,特別感謝這些文章的作者:
Maven 發布自己的項目到 Maven 中央倉庫
[干貨]--發布項目到maven中央倉庫
將項目發布到Maven中央庫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM