一、前言
最近自己在學習Spring boot的過程中開發了一個元件 multithreadpool-spring-boot-starter,通過這個元件,我們可以動態根據配置檔案進行多個執行緒池的初始化。既然有這個產出後,肯定是希望能夠上傳到maven中央倉庫,給更多的人使用,於是就產生了這次專案釋出經歷。
整個過程可謂是一波三折,由於平時工作比較忙只能晚上花一個小時搞,所以在經歷了近一週的時間後,終於成功釋出上去了。
下面把我當時的上傳過程記錄下來,希望幫助更多的朋友。
二、環境準備
1> mac osx 10.14.6 : 本文主要以mac環境為準
2> Apache Maven 3.2.3 : 本文主要使用maven進行構建和釋出例子的說明
三、步驟說明
1、工單建立
1> 訪問sonatype並註冊賬號 https://issues.sonatype.org ,注意要記住賬號密碼,會用於我們後續的釋出及相關操作
2> 如圖新建一個issue,專案需要選擇 Community Support - Open Source Project Repository Hosting
3> 參考下圖填寫概要、Group Id、專案地址、程式碼管理地址,填寫後點選確認提交。網上很多都說需要幾個小時或者隔天才有回覆,我當時等了10分鐘就收到回覆了。此時,對方跟你說兩件事情:
- 【提醒】確保 group id對應的域名是你的
- 【校驗】比如我是的專案地址是github上的,他會要求我在github上建立一個和issue同名的專案確保我擁有該專案的管理許可權,
完成確認並建立和issue同名的專案後,記得要在issue進行回覆,具體參考: sonatype-issue 和 Github倉庫
4> 在通過上述的確認和校驗後,sonatype會回覆你到時候maven釋出會用到的snapshot地址和release地址,並提醒你首次釋出後需要回復該issue,詳情參考issue
2、gpg 環境安裝
gpg的主要作用是生成金鑰對,會用於後續我們元件釋出的校驗。
1> 下載地址:https://www.gnupg.org/download/
2> 如圖紅色框所示下載並安裝
3> 在安裝完成後,執行以下命令生成金鑰對,按照提示輸入賬號、郵箱、密碼 (PS: 此處的密碼在後面釋出會用到,請務必記住)
gpg2 --gen-key
4> 執行命令檢視金鑰, 此時控制檯會輸出類似下面的內容
$ gpg2 --list-keys
...
pub rsa2048 2019-04-12 [SC] [有效至:2021-04-11]
9A1640F7A2551131612D51B12D83594B7B29D86A
uid [ 絕對 ] xiaoxuetu <xiaoxuetu@163.com>
sub rsa2048 2019-04-12 [E] [有效至:2021-04-11]
5> 執行以下命令將公鑰釋出到伺服器中
$ 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
6> 如果控制檯輸出如上面類似的錯誤內容,則將命令中的金鑰調整為 2D83594B7B29D86A
$ gpg --keyserver hkp://subkeys.pgp.net --send-keys 2D83594B7B29D86A
gpg: sending key E2A36372591567B3 to hkp://pool.sks-keyservers.net
3、Maven全域性配置
一般情況下,maven全域性配置存在於 ${HOME}/.m2/setting.xml ,如果這個目錄下沒有,則可以從 ${MAVEN_HOME}/conf/setting.xml 拷貝一份到 ${HOME}/.m2 目錄下並進行以下修改
1> 新增伺服器驗證資訊
<server> <id>sonatype_releases</id> <username>your user name</username> <password>your password</password> </server> <server> <id>sonatype_snapshots</id> <username>your user name</username> <password>your password</password> </server>
2> 配置gpg驗證命令
<settings> <profiles> <profile> <id>gpg</id> <properties> <!-- 由於我電腦安裝的是gpg2,不存在gpg命令,所以需要指定執行gpg2,否則會報錯 --> <gpg.executable>gpg2</gpg.executable> <gpg.passphrase>your password</gpg.passphrase> </properties> </profile> </profiles> <activeProfiles> <activeProfile>gpg</activeProfile> </activeProfiles> </settings>
4、專案maven配置
1> 在專案的pom.xml中,配置相應的開源協議、倉庫資訊、開發人員資訊和釋出配置
<!-- 開源簽名證照 --> <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> <!-- 倉庫資訊 --> <scm> <connection>scm:git:git@github.com:xiaoxuetu/multithreadpool-spring-boot-starter.git</connection> <developerConnection>scm:git:git@github.com:xiaoxuetu/multithreadpool-spring-boot-starter.git </developerConnection> <url>http://github.com/xiaoxuetu/multithreadpool-spring-boot-starter/tree/master</url> </scm> <!-- 開發人員資訊 --> <developers> <developer> <name>xiaoxuetu</name> <email>xiaoxuetu@163.com</email> <organization>https://github.com/xiaoxuetu</organization> <timezone>+8</timezone> </developer> </developers> <!-- 釋出管理資訊 --> <distributionManagement> <repository> <!-- 這裡的id必須要和全域性配置中的release id 一致 --> <id>sonatype_releases</id> <name>Nexus Release Repository</name> <!-- 這裡就是在建立issue成功後,對方回覆的release釋出地址--> <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url> </repository> <snapshotRepository> <!-- 這裡的id必須要和全域性配置中的snapshot id 一致 --> <id>sonatype_snapshots</id> <name>Nexus Snapshot Repository</name> <!-- 這裡就是在建立issue成功後,對方回覆的snapshot釋出地址--> <url>https://oss.sonatype.org/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement>
2> 由於釋出到maven中央倉庫會要求我們在上傳jar到同時,必須同步釋出對應到Javadoc、source、asc(利用gpg生成到校驗),所以需要在maven中新增以下構建外掛
<build> <plugins> <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> <version>1.6.7</version> <extensions>true</extensions> <configuration> <!-- 這裡的id必須要和全域性配置中的release id 一致 --> <serverId>sonatype_releases</serverId> <nexusUrl>https://oss.sonatype.org/</nexusUrl> <!-- 如果希望釋出後自動執行close和release操作,此處可以調整為true --> <autoReleaseAfterClose>false</autoReleaseAfterClose> </configuration> </plugin> <!-- 生成java source.jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <!-- 生成asc 校驗檔案 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.5</version> <executions> <execution> <!-- 必須和配置中的gpg校驗id一致 --> <id>gpg</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
5、釋出操作
1> 執行以下命令進行釋出(如果 pom.xml 中 autoReleaseAfterClose 的值為true,則指令碼會自動完成在平臺上close、release的操作,至此你將成功釋出了,否則我們繼續檢視第2步)
mvn clean javadoc:jar deploy -P release
2> 登入https://oss.sonatype.org,然後選擇staging Repositories
3> 如下圖搜尋並選擇需要釋出的元件,依次執行Close、Release操作
4> 如果Release成功,並且你是首次釋出元件,則需要到你建立到issue中回覆 “我已經成功釋出該元件”,經歷大概2小時後,該元件將會同步到對應的maven倉庫
5> 如果Close或者Release不成功,你可以如下圖操作檢視原因並谷歌定位,或者回復諮詢
四、參考文件
1> 釋出構件到 Maven 中央倉庫遇到的坑: https://juejin.im/post/5cb03e1a5188251b0e4e3583
2> Working with PGP Signatures: https://central.sonatype.org/pages/working-with-pgp-signatures.html#distributing-your-public-key
3> Deploying to OSSRH with Apache Maven: https://central.sonatype.org/pages/apache-maven.html