Maven 發布自己的項目到 Maven 中央倉庫
可能很多人都在用 Maven 倉庫,但是如果要問怎么發布項目到中央倉庫,估計很多人都不知道了,下面本篇文章帶大家往中央倉庫發布一個自己的 Maven 項目。
大致步驟
-
在 Sonatype 提出 Issue 申請
-
注冊 Sonatype 的賬戶。地址:https://issues.sonatype.org/secure/Signup!default.jspa
issues.sonatype.org 是一個 Jira 站點,用來管理流程。oss.sonatype.org 為 nexus 站點,構件發布是在這個 OSS 系統上。這兩個網址的用戶名和密碼相同。
-
提交發布申請,創建 Issue。地址:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
- 項目類型是 Community Support - Open Source Project Repository Hosting
- groupId 對應的域名你需要有所有權
-
等待 Issue 審批通過。
-
-
使用 GPG 生成密鑰對。下載地址:https://www.gnupg.org/download/。用得到的指令有如下幾條:
gpg --version
檢查安裝成功沒gpg --gen-key
生成密鑰對gpg --list-keys
查看公鑰gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 公鑰ID
將公鑰發布到 PGP 密鑰服務器gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 公鑰ID
查詢公鑰是否發布成功
-
配置 Maven。需要修改的 Maven 配置文件包括:setting.xml(全局級別)與 pom.xml(項目級別)
- setting.xml:在其中加入 server 信息,包含 Sonatype 賬號的用戶名與密碼
- pom.xml:在其中配置 profile,包括插件和 distributionManagement。snapshotRepository 與 repository 中的 id 一定要與 setting.xml 中 server 的 id 保持一致。
-
上傳構件到 OSS 中並發布。
-
上傳構件。mvn clean deploy -P release
-
在 OSS 中發布構件。進入 https://oss.sonatype.org/,點擊"Staging Repositories" -> 在搜索欄輸入你的 groupId -> 勾選你的構件並點擊 close -> 點擊 tab 欄的 release。
-
通知 Sonatype 構件已成功發布,關閉 Issue。
-
-
后續更新
1. 在 Sonatype 提出 Issue 申請
1.1 注冊 Sonatype 用戶
注冊地址:https://issues.sonatype.org/secure/Signup!default.jspa
使用了 Jira 來管理流程,記住用戶名和密碼,后面會用到。
1.2 創建一個發布項目的 Issue
地址:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
這里需要特別說明的是 Group Id,如果你是托管在 Github 或者 Git@OSC 可以使用 com.github.binarylei 或者 net.oschina.XXX,剩下的可以依照實際情況填寫,例如托管的地址等等(托管地址等信息會在用去 maven 倉庫搜索的時候顯示,用來幫助用戶找到你的項目地址尋求幫助)。另外此處填寫的 groupId 必須和你要發布的組件的 pom 中的 groupIdd 一樣,必須一樣!!!
1.3 等待 Issue 審批
這個審核還是很及時的,我的幾分鍾后就收到審核結果。如果不通過審核人員會告訴你不通過的原因,例如當你用的是自己的域名時(不是github)s審核人員會詢問你域名是否是你的,回復一下就行。審核通過后會收到郵件通知,同時在 Issue 下面會看到 Sonatype 工作人員的回復,一般是添加一個 scomment,內容大致如下:
com.github.binarylei has been prepared, now user(s) binarylei can:
* Deploy snapshot artifacts into repository https://oss.sonatype.org/content/repositories/snapshots
* Deploy release artifacts into the staging repository https://oss.sonatype.org/service/local/staging/deploy/maven2
* Promote staged artifacts into repository 'Releases'
* Download snapshot and release artifacts from group https://oss.sonatype.org/content/groups/public
* Download snapshot, release and staged artifacts from staging group https://oss.sonatype.org/content/groups/staging
這個是工作人員告訴我已經通過了,可以去下面那個地址發布(前兩個地址),發布后去下面后兩個地址搜索。
2. 使用 GPG 生成密鑰對
Windows 系統,可以下載 Gpg4win 軟件來生成密鑰對。下載地址:https://www.gpg4win.org/download.html
推薦使用 Gpg4win-Vanilla 版本,因為它僅包括 GnuPG,這個工具才是我們所需要的。
Linux 系統,直接從源中安裝gpg軟件包就行。更多GnuPG使用詳情
安裝 GPG 軟件后,打開命令行窗口,依次做以下操作:
(1)查看是否安裝成功
gpg --version
出現版本等信息說明安裝成功了。
(2)生成密鑰對
```
gpg --gen-key
Real name: binarylei
Email address: binarylei@qq.com
You selected this USER-ID:
"binarylei <binarylei@qq.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
```
之后往下,會讓你輸入用戶名和郵箱,還有一個Passphase(輸入兩次),相當於密鑰庫密碼,不要忘記。
(3)查看公鑰
```
gpg --list-keys
C:/Users/len/AppData/Roaming/gnupg/pubring.kbx
----------------------------------------------
pub rsa2048 2017-12-16 [SC] [expires: 2019-12-16]
9DF36BF5DFB87B6F04DBCE3D63EC6544BEE6682D
uid [ultimate] binarylei <binarylei@qq.com>
sub rsa2048 2017-12-16 [E] [expires: 2019-12-16]
```
我這里的公鑰ID是9DF36BF5DFB87B6F04DBCE3D63EC6544BEE6682D,馬上就會用到了。
(3)將公鑰發布到 PGP 密鑰服務器
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 9DF36BF5DFB87B6F04DBCE3D63EC6544BEE6682D
gpg: sending key 63EC6544BEE6682D to hkp server pool.sks-keyservers.net
此后,可使用本地的私鑰來對上傳構件進行數字簽名,而下載該構件的用戶可通過上傳的公鑰來驗證簽名,也就是說,大家可以驗證這個構件是否由本人上傳的,因為有可能該構件被壞人給篡改了。
(4)查詢公鑰是否發布成功
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 9DF36BF5DFB87B6F04DBCE3D63EC6544BEE6682D
gpg: key 63EC6544BEE6682D: "binarylei <binarylei@qq.com>" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
3. 修改Maven配置文件
3.1 setting.xml
找到maven的全局配置文件settings.xml,在里面找到 節點,這個節點默認是注釋掉的,增加如下配置:
<servers>
<server>
<id>oss</id>
<username>用戶名</username>
<password>密碼</password>
</server>
</servers>
這里的 id 是要在 pom.xml 里面使用的,用戶名和密碼就是在 Sonatype 上面注冊的用戶名和密碼。
3.2 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</name>
<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>
<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 標簽。
4. 發布到 OSS nexus 倉庫中
4.1 上傳到 OSS
mvn clean deploy -P release
當執行以上 Maven 命令時,會自動彈出一個對話框,需要輸入上面提到的 Passphase,它就是剛才設置的 GPG 密鑰庫的密碼。
隨后會看到大量的 upload 信息,因為在國內網絡的緣故,時間有點久,耐心等待吧。
注意:此時上傳的構件並未正式發布到中央倉庫中,只是部署到 OSS 中了,下面才是真正的發布。
4.2 在 OSS 中發布構件
使用 Sonatype 賬號登錄 https://oss.sonatype.org/#stagingRepositories,可在 Staging Repositories 中查看剛才已上傳的構件。
一般發布的構件不多,可以直接拉到底就能看到自己的構件,也可進行模糊查詢定位到自己的構件(見后邊附圖)。
最后,點擊 Release 按鈕來發布該構件。手動刷新后看到已經發布。
4.3. 通知 Sonatype 構件已成功發布
4.3.1 在之前的在Issue下面回復
在 Issue 下面回復一條“構件已成功發布”的評論,這是為了通知 Sonatype 的工作人員為需要發布的構件做審批,發布后會關閉該 Issue。
這個前面的 Sonatype 工作人員其實在審核你的 Issue 時,在 comment 中已經提示你了,
在 Issue 下面回復一條“構件已成功發布”的評論,這是為了通知 Sonatype 的工作人員為需要發布的構件做審批,發布后會關閉該 Issue。
4.3.2 等待構件審批通過
這個,又只能等待了,當然他們晚上上班,還是第二天看。當審批通過后,將會收到郵件通知。
4.3.3 從中央倉庫中搜索構件
這時,就可以在 maven 的中央倉庫中搜索到自己發布的構件了,以后可以直接在 pom.xml 中使用了!
中央倉庫搜索網站:http://search.maven.org/
第一次成功發布之后,以后就不用這么麻煩了,可以直接使用 groupId 發布任何的構件,當然前提是 groupId 沒有變。
5. 以后的發布流程
a)構件完成后直接使用 maven 在命令行上傳構建;
b)在 https://oss.sonatype.org/ close 並 release 構件;
c) 等待同步好(大約2小時多)之后,就可以使用了
參考: