歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
關於maven中央倉庫
-
作為一個java程序員,對maven中央倉庫https://mvnrepository.com/自然是非常熟悉的,畢竟咱們的應用依賴的jar大部分都來自此處,如果您想把自己開發的java庫也托管在上面,讓大家像使用Jackson、Spring那樣輕松簡單的使用您的jar,就請隨本文一起操作吧;
-
先看看效果,下圖是我發布的java庫在中央倉庫的搜索結果:
前提條件
- 由於sonatype官方會要求您在github創建一個倉庫(倉庫名由sonatype官方指定,以此驗證您是否有github操作權限),因此請確保您自己有github賬號,並且可以創建倉庫
本篇概覽
- 梳理一下,按照以下步驟將自己的java庫發布到maven中央倉庫:
-
文末還會對曾經踩過的小坑做了總結,希望能幫助讀者們提前避開
-
看起來略有些繁瑣,但其實很簡單,接下來開始吧
准備工作
-
首先請把您的java工程准備好,我用的是一個非常普通的maven工程,名為opencv-linux,github倉庫地址https://github.com/zq2599/opencv-client
-
本次涉及的軟件信息如下:
- 操作系統:macOS Monterey(12.0.1)
- JDK:1.8.0_312
- Maven:3.8.3
1. 注冊帳號
- 打開網站https://issues.sonatype.org,注冊一個帳號,登錄后效果如下圖:
2. 創建問題(issue)
- 點擊上圖紅框中的新建開始創建issue,如下圖,項目選擇Community Support,問題類型是New Project:
- 接下來填寫項目相關的信息,請注意Project URL里面是您自己的工程對應的github倉庫地址:
- 提交后等待幾分鍾,注冊賬號時填寫的郵箱會收到一封郵件,要求你創建一個倉庫,以此來證明之前提交的github帳號屬於你自己:
- 上述內容在剛才新建的issue頁面也能看到,如下圖,即sonatype的評論:
3. 創建sonatype指定的倉庫
-
登錄您的github,按照要求創建倉庫,我這里要創建的是https://github.com/zq2599/OSSRH-74965
-
老老實實的創建出來就行了:
4. 在issue上進行回復
- 打開issuse,增加一個評論,如下圖:
- 不久后(我這邊是十多分鍾),就會收到一條新的評論,通知你可以去做發布了,並給你了snapshot和release的發布地址:
5. 安裝GPG
-
后面的操作中,在將jar發布到中央倉庫時,要用GPG工具對上傳的數據進行簽名,因此接下來要准備好GPG秘鑰
-
先安裝GPG軟件,打開網站:https://www.gnupg.org/download/
-
下載安裝文件,請選擇適合您的操作系統的,我的選擇如下圖紅框:
- 安裝GPG
6. 生成秘鑰並上傳
-
安裝完成后,在控制台執行gpg2 --gen-key開始創建秘鑰
-
根據提示輸入賬號、郵箱、密碼等:
GnuPG needs to construct a user ID to identify your key.
Real name: zq2599
Email address: zq2599@gmail.com
You selected this USER-ID:
"zq2599 <zq2599@gmail.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
- 操作完成后得到如下信息:
gpg: key 11027EJIHGFEDCBA marked as ultimately trusted
gpg: directory '/Users/will/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/will/.gnupg/openpgp-revocs.d/561AEE4EA92EE3E4C389941811027E9876543210.rev'
public and secret key created and signed.
pub rsa3072 2021-11-10 [SC] [expires: 2023-11-10]
561AEE4EA92EE3E4C389941811027E9876543210
uid zq2599 <zq2599@gmail.com>
sub rsa3072 2021-11-10 [E] [expires: 2023-11-10]
-
如上所示,得到了pub key等於561AEE4EA92EE3E4C389941811027E9876543210
-
執行以下命令,將秘鑰同步到雲端,注意keyserver,網上可以搜到很多個,個人實際操作中,下面這個是可以成功的:
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 561AEE4EA92EE3E4C389941811027E9876543210
7. maven全局配置
-
試想把sonatype的賬號密碼寫在項目的pom.xml中,再上傳到github讓所有人都看到?相信您一定不願意這樣,所以還是放在maven的全局配置中比較安全,畢竟是保存在自己的電腦上
-
打開maven的配置文件settings.xml,在servers下面增加一個server節點,這是個賬號密碼的配置,對應的是https://issues.sonatype.org的賬號密碼:
<server>
<id>ossrh</id>
<username>zq2599</username>
<password>12345678</password>
</server>
- 在profiles下增加一個profile節點,gpg.passphrase的內容是剛才創建gpg秘鑰時輸入的密碼:
<profile>
<id>gpg</id>
<properties>
<!-- 由於我的電腦裝的gpg2,所以需要指定執行gpg2,否則會報錯 -->
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>abcdefgh</gpg.passphrase>
</properties>
</profile>
- 涉及到賬號密碼的全局配置就完成了,接下來打開您的java工程,咱們去修改pom.xml的配置
8. maven項目配置
- 首先要搞清楚發布倉庫的地址在哪,官方指導如下,給出了snapshot和release的倉庫地址:
- 以下是java工程的pom.xml文件,需重點關注的地方都有中文注釋,請不要漏掉帶序號的注釋,這些都是最關鍵的配置,這種注釋共11個:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.zq2599</groupId>
<artifactId>opencv-linux</artifactId>
<version>0.0.3</version>
<name>opencv-linux</name>
<description>opencv-linux</description>
<!-- 1. url必須要有,不然遠程提交時會返回錯誤 -->
<url>https://github.com/zq2599/opencv-client</url>
<properties>
<java.version>1.8</java.version>
</properties>
<packaging>jar</packaging>
<!-- 2. 開源證書 -->
<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>
<!-- 3. 源碼倉庫信息 -->
<scm>
<connection>scm:git:git@github.com:zq2599/opencv-client.git</connection>
<developerConnection>scm:git:git@github.com:zq2599/opencv-client.git</developerConnection>
<url>https://github.com/zq2599/opencv-client/tree/main</url>
</scm>
<!-- 4. 開發人員信息 -->
<developers>
<developer>
<name>zq2599</name>
<email>zq2599@gmail.com</email>
<organization>https://github.com/zq2599</organization>
<timezone>+8</timezone>
</developer>
</developers>
<!-- 5. 上傳的倉庫地址,以及使用哪個賬號密碼配置 -->
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
<build>
<!-- 配置好每個插件的屬性 -->
<pluginManagement>
<plugins>
<!-- 6. 上傳到sonatype的插件 -->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<!-- 這里的id必須要和全局配置中的server一致 -->
<serverId>ossrh</serverId>
<!-- 這個地址,一定要和issue的評論中給出的地址一致! -->
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<!-- 如果希望發布后自動執行close和release操作,此處可以調整為true -->
<autoReleaseAfterClose>false</autoReleaseAfterClose>
</configuration>
</plugin>
<!-- 7. 上傳源碼的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<inherited>true</inherited>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<excludeResources>true</excludeResources>
<useDefaultExcludes>true</useDefaultExcludes>
</configuration>
</plugin>
<!-- 8. 生成doc文檔的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.0.0</version>
<inherited>true</inherited>
<executions>
<execution>
<id>bundle-sources</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<maxmemory>1024</maxmemory>
<encoding>UTF-8</encoding>
<show>protected</show>
<notree>true</notree>
<!-- Avoid running into Java 8's very restrictive doclint issues -->
<failOnError>false</failOnError>
<doclint>none</doclint>
</configuration>
</plugin>
<!-- 9. 編譯構建maven工程的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<!-- 10. 確定要使用哪些插件 -->
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<!-- 11. 生成簽名,確定使用那個gpg秘鑰 -->
<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>
</profile>
</profiles>
</project>
9. 編譯、構建、上傳
- 編譯構建上傳其實很簡單,下面一行命令搞定(進入pom.xml所在目錄下執行以下命令):
mvn clean javadoc:jar deploy -P release
- 構建期間會彈出窗口讓你輸入密碼,請輸入創建GPG秘鑰時設置的密碼:
- 構建和上傳成功后,控制台輸出如下(截選):
...
[INFO] Installing /Users/zhaoqin/github/blog_demos/opencv-linux/target/opencv-linux-0.0.3-sources.jar.asc to /Users/zhaoqin/github/blog_demos/opencv-linux/target/nexus-staging/staging/543da2cd9af848/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "543da2cd9abc12"
[INFO] * Created staging repository with ID "iogithubzq2599-1008".
[INFO] * Staging repository at https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008
[INFO] * Uploading locally staged artifacts to profile io.github.zq2599
Uploading to ossrh:
...
https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc (659 B at 1.2 kB/s)
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "iogithubzq2599-1008".
Waiting for operation to complete...
...
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 27.199 s
[INFO] Finished at: 2021-11-12T08:08:37+08:00
- 記住上述信息中展示的iogithubzq2599-1008,這是本次上傳操作在倉庫中對應的ID
10. 登錄指定的倉庫網址
- 接下來登錄Nexus網站,具體的網址一定要看issue的評論,如下圖紅框,我這里要登錄的是:https://s01.oss.sonatype.org
- 點擊下圖右上角紅框登錄,賬號密碼是在https://issues.sonatype.org注冊的那個:
11. 發布
- 登錄成功后,點擊下圖紅框中的Staging Repositories:
- 如下圖,找到合適的記錄(我這里是iogithubzq2599-1008),點擊紅框3中的Release進行發布,如果狀態不是closed,就要展開底部的Activity查看發生了什么異常:
- 操作成功,如下圖所示:
12. issue收到評論,提示完成時間
- 靜候十多分鍾,issue上收到一條評論,提示同步操作已激活,三十分鍾內同步到https://repo1.maven.org/,四小時內同步到https://search.maven.org:
- 網上有文章提到第一次發布要在issuse上評論,才會觸發同步操作,我這里沒有遇到(正打算評論呢,發現已經開始同步了)
13. 三十分鍾內同步到https://repo1.maven.org
- 靜候三十分鍾,可以在網站https://repo1.maven.org上看到上傳的工程相關文件了,如下圖:
14. 四小時內同步到https://search.maven.org
- 靜候四小時,可以在網站https://search.maven.org上看到上傳的工程相關文件了,如下圖:
15. 二十四小時內同步到https://mvnrepository.com/
- 同步到https://mvnrepository.com的時間並不是精確的二十四小時,而是我時隔二十四左右在此網站上可以搜索到自己的庫:
- 至此,自己的java庫已成功發布到maven中央倉庫,可以像Jackson、Spring庫那樣使用這個庫了,用法就是添加這個依賴:
<dependency>
<groupId>io.github.zq2599</groupId>
<artifactId>opencv-linux</artifactId>
<version>0.0.3</version>
</dependency>
踩坑記錄
- 現在已完成了所有的操作,回顧一下,整個過程其實相對比較順利,只遇到了三個小坑需要您注意:
- 同步gpg秘鑰到雲端的時候,網上有文章提到用hkp://subkeys.pgp.net,我在使用該地址的時候一直在報錯,改為hkp://keyserver.ubuntu.com:11371之后上傳成功
- maven工程的pom.xml文件中,一定要有url節點,如下圖,否則會在同步到雲端的時候報錯Project url missing
- 發布的操作是在網頁上進行的,網上有的文章提到網站是https://oss.sonatype.org,最初我也打開了該網頁並嘗試登錄,可惜始終登錄失敗,最終,在issue的評論上發現如下圖紅框,要登錄的網站是https://s01.oss.sonatype.org
- 至此,所有操作都已完成,如果您正在將自己的java庫發布到maven中央倉庫,希望本文能給您一些參考
歡迎關注公眾號:程序員欣宸
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos