作為 Java 開發者(偽),工作中一定離不開 Maven。 偶爾也需要釋出自己的構件到 Maven 中央倉庫中(oss.sonatype.org/)。 但是經常有這樣那樣的坑(因為總是換電腦 XD),在這裡記錄一下,以備後續查閱。
上傳步驟
將專案釋出到 maven 中央倉庫的一般步驟如下:
-
註冊Sonatype的賬戶。地址:issues.sonatype.org/secure/Sign…
-
提交發布申請。(僅第一次)
- 建立 Issue:issues.sonatype.org/secure/Crea…
- 專案型別是
Community Support - Open Source Project Repository Hosting
groupId
對應的域名你需要有所有權
-
使用 GPG 生成金鑰對。
Windows 安裝:gpg4win.org/
Mac 安裝:
brew install gpg
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
配置一覽<settings> ... <servers> <server> <id>snapshotRepository-id</id> <username>使用者名稱</username> <password>密碼</password> </server> </servers> ... </settings> 複製程式碼
使用自己註冊的 Sonatype 賬號的使用者名稱與密碼來配置以上 server 資訊。
此處 id
snapshotRepository-id
應和下面pom.xml
中 snapshotRepository 和 repository 裡面的 id 保持一致。pom.xml
配置一覽
<project> ... <name>your project's name</name> <description>your project's description</description> <url>http://www.chengww.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>chengww</name> <email>chengww5217@163.com</email> </developer> </developers> ... <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>snapshotRepository-id</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> </snapshotRepository> <repository> <id>snapshotRepository-id</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 保持一致。
-
-
上傳構件到 OSS 中。
mvn clean deploy -P release
-
在 OSS 中釋出構件。進入 oss.sonatype.org/,點選
Staging Repositories
-> 在搜尋欄輸入你的 groupId -> 勾選你的構件並點選 close -> 點選 tab 欄的 release。 -
通知 Sonatype 的工作人員關閉 issue。(僅第一次)
參考地址:my.oschina.net/huangyong/b…
等待審批通過後,就可以在中央倉庫中搜尋到自己釋出的構件了!
但是,事情並不是那麼簡單的。總是會出現這樣那樣的坑。
碰到的坑一覽
GPG 生成金鑰對
訊息提示亂碼
出現該步驟其實是輸入密碼的步驟。但是由於是中文的緣故,訊息提示亂碼了。
只需要在下面橫線上輸入密碼之後,將游標移動到下面的好,回車即可。注意,密碼需要輸入兩次,請保持兩次一致。
將公鑰釋出到 PGP 金鑰伺服器
gpg: 傳送至公鑰伺服器失敗:Server indicated a failure
因安裝了新版的 gpg,在 gpg --list-keys
時顯示如下:
pub rsa2048 2019-04-12 [SC] [有效至:2021-04-11]
9A1640F7A2551131612D51B12D83594B7B29D86A
uid [ 絕對 ] chengww <chengww5217@163.com>
sub rsa2048 2019-04-12 [E] [有效至:2021-04-11]
複製程式碼
釋出公鑰到伺服器時,填的公鑰 ID 為 9A1640F7A2551131612D51B12D83594B7B29D86A
,終端上顯示為:
gpg --keyserver hkp://subkeys.pgp.net --send-keys 9A1640F7A2551131612D51B12D83594B7B29D86A
...
gpg: 正在傳送金鑰 2D83594B7B29D86A 到 hkp://subkeys.pgp.net
gpg: 傳送至公鑰伺服器失敗:Server indicated a failure
gpg: 傳送至公鑰伺服器失敗:Server indicated a failure
複製程式碼
只需要將公鑰 ID 從 9A1640F7A2551131612D51B12D83594B7B29D86A
修改成 2D83594B7B29D86A
即可:
gpg --keyserver hkp://subkeys.pgp.net --send-keys 2D83594B7B29D86A
複製程式碼
配置 maven
全域性級別 setting.xml 在哪裡配置
settings.xml
檔案一般存在於兩個位置:
全域性配置: ${M2_HOME}/conf/settings.xml
使用者配置:${user.home}/.m2/settings.xml
如果實在是不清楚的,請自行 mvn -X
檢視:
...
[DEBUG] Reading global settings from /usr/local/Cellar/maven/3.6.0/libexec/conf/settings.xml
[DEBUG] Reading user settings from /Users/chengww/.m2/settings.xml
...
複製程式碼
關於 setting.xml
相關講解參見:www.jianshu.com/p/110d897a5…
上傳構件到 OSS
Maven Sonatype Nexus return 401
401 錯誤,一般都是未在 setting.xml
中設定使用者名稱密碼所致(或使用者名稱密碼不正確)。
參見上述 4.配置 maven 配置下 setting.xml
。
gpg: signing failed: Inappropriate ioctl for device
原因是新版 gpg 在當前終端無法彈出密碼輸入頁面。
解決:
export GPG_TTY=$(tty)
複製程式碼
在當前終端中 export(臨時解決)
或者加入到 ~/.bash_profile
,然後 source ~/.bash_profile
gpg: signing failed: Screen or window too small
執行上述命令後在 IntelliJ IDEA 中的終端(Terminal)中還是不能彈出密碼輸入介面,且報上面的錯。
這個時候就要到系統的的終端,cd 到專案目錄,然後執行 mvn clean deploy -P release
結束語
路漫漫其修遠兮,願天下沒有 BUG。