本文記錄了在maven環境下使用gpg插件将 jar 包部署到中央倉庫并快速檢驗和更新的完整實踐過程。相對于網上其他教程使用oss-parent作為父工程的方法,這種方法入侵度低,自由度高,也是官方推薦使用的。實踐過程解決了gpg驗證以及javadoc注解不規範的問題。
文章目錄
-
- 先行知識
-
- 1 項目基礎配置
- 2 Maven釋出相關網址
- 3 釋出事項
- 一 注冊并送出工單(register sonatype)
- 二 使用gpg生成密鑰
- 三 完成maven配置
-
- 1 配置 setting.xml
- 2 配置pom檔案基本資訊
- 3 在pom檔案裡配置gpg相關插件
- 四 完成第一次釋出
-
- 1 運作 deploy
- 2 到issue添加comment
- 3 檢視 search.maven.org
- 五 版本更新
- 六 其他
先行知識
1 項目基礎配置
首先需要注意項目的 groupId,下文注冊sonatype賬号時也需要填寫 groupId ,兩者最好一緻,并確定你擁有該域名所有權,我推薦用GitHub個人首頁作為對應位址。格式為 com.github.username
本文以如下配置為例:
<groupId>com.github.linshenkx</groupId>
<artifactId>rpc-netty-spring-boot-starter</artifactId>
<version>1.0.0.RELEASE</version>
2 Maven釋出相關網址
在整個釋出過程中,有以下3個關鍵網址,注意前2個共用一個賬号。
-
工單管理:https://issues.sonatype.org
負責申請上傳資格及完成第一次上傳,後續更新不需要使用,相當于一個啟動裝置。
-
構件倉庫 : https://oss.sonatype.org
上傳的jar包會先存放到這裡,在這裡進行 Release 後即可釋出到maven中央倉庫。
-
鏡像倉庫: http://search.maven.org
最終成功釋出的jar可以在這裡搜到。
3 釋出事項
網上有些人說使用相同版本号部署可以覆寫原版本,經試驗是不行的,也很好了解,對于同一個版本的jar包,怎麼可能因為拉取時間的不同而導緻獲得内容的不同呢?是以,應該将每一次上傳部署都看作不可逆操作,謹慎對待。
一 注冊并送出工單(register sonatype)
首先進入 https://issues.sonatype.org 新增賬號并登入
然後點選最上面的 Create建立Issue,選擇Project和Issue Type如下
除了這兩個選擇項外,其他的必填項按照提示填就好,需要特别注意的是,你要擁有GroupId對應的域名的所有權,私有域名的話需要驗證所有權會比較麻煩(在Attachment項提供證書),個人的話最好就是使用項目對應托管平台的首頁,這樣可以省去驗證的步驟。建立完成可見如下:
注意這個過程是需要背景管理者稽核的,一般在2個小時左右即會有回複,在稽核通過之前 Issue 的狀态将是 open,通過後為 resolved ,有問題的話 Resolution 将顯示 Unresolved 直到你解決後才會顯示為 Fixed。
項目的驅動将通過Comments來進行,如下,通過後管理者将添加如下comment
Configuration has been prepared, now you 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
前面兩個倉庫用于上傳,分别對應工程的 snapshots版本和 release版本,要配置到pom檔案裡。
釋出成功的工程可以通過後面兩個倉庫檢視和下載下傳,晚點會同步到中央倉庫裡。
二 使用gpg生成密鑰
這一步我主要參考了官方指南 https://central.sonatype.org/pages/working-with-pgp-signatures.html 上面用指令行的方式一步步寫得很清楚了,不過我發現其過程比較适用于Linux環境,Windows環境下有所不同
我使用的環境是window和maven,使用mac和gradle的也可以參考,但後面maven配置具體步驟會有不同,需要注意。
這裡我推薦使用gpg的gui工具,可視化生成密鑰,也可以使用指令行。
Windows的話先到 https://gpg4win.org/download.html 下載下傳最新的版本,直接安裝即可打開即可
-
建立密鑰對(OpenPGP類型)
這裡需要填入名字和電子郵件,然後注意可以在進階設定那裡将有效期一欄的小勾取消掉,即有效期無限,如下
- 确認資訊并輸入密碼
-
選擇将公鑰上傳到目錄服務
注意:如果這裡不點的話後面分發後将無法在伺服器找到對應公鑰
- 右鍵選擇生成的證書在伺服器上釋出
-
根據密鑰ID在伺服器上查找公鑰
最終必須保證這一步成功!如下
注意:這裡有個bug,如果生成的密鑰ID的第一個字元是數字0的話,在下面使用maven-gpg插件的時候可能會被自動去掉導緻密鑰找不到,是以保險起見遇到這種情況就重新生成證書
三 完成maven配置
這裡主要參考 https://central.sonatype.org/pages/apache-maven.html
注意網上很多教程都使用了将pom父工程設定為 org.sonatype.oss:oss-parent的方法,這種方法對工程侵入性極強,官方已經标記為 不推薦使用 了。
1 配置 setting.xml
<settings>
<servers>
<server>
<id>ossrh</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
</servers>
</settings>
如果使用的是Mac系統,由于使用的是 gpg2 還需要在正在使用的profile下配置如下屬性
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>the_pass_phrase</gpg.passphrase>
</properties>
2 配置pom檔案基本資訊
在pom檔案裡添加developers、scm、licenses等資訊,如下
<developers>
<developer>
<name>LinShen</name>
<email>[email protected]</email>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/linshenkx/rpc-netty-spring-boot-starter</connection>
<developerConnection>scm:git:[email protected]/linshenkx/rpc-netty-spring-boot-starter.git</developerConnection>
<url>https://github.com/linshenkx/rpc-netty-spring-boot-starterr</url>
<tag>HEAD</tag>
</scm>
<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>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
3 在pom檔案裡配置gpg相關插件
根據官方指南,這裡需要4個插件,
- maven-source-plugin 用來生成Source Jar檔案
- maven-javadoc-plugin 用來生成 javadoc 文檔
- maven-gpg-plugin 用來對工程檔案進行自動簽名
-
nexus-staging-maven-plugin 用來将工程釋出到中央倉庫
另外注意生成javadoc文檔時需要指定關閉doclint,不然可能因為使用了不規範的javadoc注解而導緻失敗,完整配置如下
<build>
<plugins>
<!--生成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>
<!--生成Javadoc,關閉doclint,避免注解檢查不通過-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
</execution>
</executions>
</plugin>
<!--Maven GPG插件用于使用以下配置對元件進行簽名-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!--Nexus Staging Maven插件是将元件部署到OSSRH并将其釋出到Central Repository的推薦方法-->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>
注意我這裡在 nexus-staging-maven-plugin 插件裡開啟了自動 Release。也可以關掉,然後登入構件倉庫 : https://oss.sonatype.org 手動去 close然後 relseae
四 完成第一次釋出
1 運作 deploy
這裡建議在確定能正确運作的前提下跳過測試,即在pom檔案所在目錄下運作如下指令
mvn clean deploy -Dmaven.test.skip=true
運作的過程會要求輸入 gpg的私鑰密鑰。
最後的輸出應該如下,即先上傳再close,再release。
中間如果出錯直接在控制台就可以檢視到資訊,也可以去構件倉庫看。
2 到issue添加comment
上述步驟順利完成後到issue下評論,如下,第一次在close的時候就已經失敗了,我沒有注意到就去comment,背景管理者提醒我去檢視錯誤資訊,第二次comment後就順利通過。大概過兩個小時就可以去 search.maven.org 檢索上傳的jar包了。
3 檢視 search.maven.org
如下,根據groupId進行檢索,需要注意的是,目前結果還不是完整的,事實上,有些快一點的2個小時後即可檢索到,有些則花了6個小時,有些還不止,是以當工程比較大的時候請耐心等候。
如果擔心是哪裡出問題的話可以先到 https://oss.sonatype.org/content/groups/public 或者 https://oss.sonatype.org/content/groups/staging 檢視上傳是否成功,也可以在pom檔案裡将設定這些倉庫,可以最快拉取到最新版本。
五 版本更新
更改版本号再直接部署操作即可,不需要再去issue進行comment,等待時間會短很多。網上有些人說使用相同版本号部署可以覆寫原版本,經試驗是不行的,也很好了解,對于同一個版本的jar包,怎麼可能因為拉取時間的不同而導緻獲得内容的不同呢?是以,應該将每一次上傳部署都看作不可逆操作,謹慎對待。
六 其他
參考資料:
https://central.sonatype.org/pages/apache-maven.html
https://central.sonatype.org/pages/working-with-pgp-signatures.html
https://www.gnupg.org/howtos/zh/index.html
https://docs.kde.org/stable5/en/pim/kleopatra/index.html
https://stackoverflow.com/questions/28846802/how-to-manually-publish-jar-to-maven-central/42917618