在Maven項目中,90%以上的jar包是通過pom文件直接從開源倉庫中獲取依賴jar包文件,然後在項目中進行集成使用。 此時如果你有一個開源項目,那麼如何將該開源項目發佈到Maven中央倉庫,讓其他人可以方便的使用,而不是先下載jar,然後install的本地? 本文將通過一步步的操作帶領大家講自 ...
在Maven項目中,90%以上的jar包是通過pom文件直接從開源倉庫中獲取依賴jar包文件,然後在項目中進行集成使用。
此時如果你有一個開源項目,那麼如何將該開源項目發佈到Maven中央倉庫,讓其他人可以方便的使用,而不是先下載jar,然後install的本地?
本文將通過一步步的操作帶領大家講自己的開源項目發佈到Maven中央倉庫(Maven Central Repository)中,https://mvnrepository.com/。
Maven中央倉庫並不支持直接發佈jar包,需要將jar包發佈到一些指定的第三方Maven倉庫,然後該倉庫再將jar包同步到Maven中央倉庫,Sonatype便是這樣的角色
準備工作
-
註冊Github賬戶,在申請的時候需要用到GroupId,這邊如果沒有自己的網站及功能變數名稱建議註冊Github。
-
註冊Sonatype賬戶,註冊地址:sonatype sign up
- Username和Password作為登錄的賬號密碼
- 密碼有強度要求
- Email用於後續關聯的通知,務必使用真實地址
項目發佈申請
-
點擊導航欄的"新建"進行項目發佈申請創建。
通過在JIRA上創建issue來申請發佈新的jar包,Sonatype的工作人員會進行審核,一般按照要求填寫不會有問題。
註意:
Group Id
:如果有功能變數名稱可以填寫自己的功能變數名稱,如果沒有可以使用Github
,Gitee
,Gitlib
等地址例如:io.github.you_account
,此處註意必須是io
的Project Url
及SCM Url
建議都採用Git地址,其中SCM
的地址需要帶.git
Already Synced to Central
選擇No
-
提交後等待一小段時間再來查看剛提交的問題。你會收到類似下圖的回覆。此時會要求進行
Group Id
的所有權驗證。如果填寫的是Github則會要求創建一個指定的倉庫,創建一個即可。
如果填寫的是自己的自己的功能變數名稱則會要求創建個指定文件到此功能變數名稱下。
-
填寫按要求完成後修改狀態為
開放狀態
。點擊Wait for Reponse
在彈出的狀態列表中選擇開放
。
如果按要求完成了所有的操作等待一段時間後一般就自動通過了。這時會給予推送伺服器的地址,後續所有的相關地址都需要用到。
到此發佈申請也就完成了。
安裝GPG
發佈到Maven倉庫中的所有文件都要使用GPG簽名,以保障完整性。因此,我們需要在本地安裝並配置GPG。
-
根據操作系統下載不同的版本併進行安裝。
此處以Windows為例:
建議下載2個安裝包分別為
-
Gpg4win:Full featured Windows version of GnuPG
此工具通過Windows視窗進行密鑰的管理。
-
download sig:Simple installer for GnuPG 1.4
此工具用於後續Maven發佈使用
-
-
創建密鑰
-
Gpg4win
生成秘鑰,按步步驟提示進行操作
必須勾選密碼
按提示輸入密碼
秘鑰生成好後,右鍵選擇密鑰,需要你把公鑰上傳到公共伺服器供sonatype驗證。
-
命令行
生成秘鑰,按步驟提示進行操作
gpg --generate-key # 生成結果 gpg (GnuPG/MacGPG2) 2.2.32; Copyright (C) 2021 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 註意:使用 “gpg --full-generate-key” 以獲得一個全功能的密鑰生成對話框。 GnuPG 需要構建用戶標識以辨認您的密鑰。 真實姓名: xxxxxxx 電子郵件地址: [email protected] 您選定了此用戶標識: “xxxxxxxx <[email protected]>” 更改姓名(N)、註釋(C)、電子郵件地址(E)或確定(O)/退出(Q)? u 更改姓名(N)、註釋(C)、電子郵件地址(E)或確定(O)/退出(Q)? o 我們需要生成大量的隨機位元組。在質數生成期間做些其他操作(敲打鍵盤 、移動滑鼠、讀寫硬碟之類的)將會是一個不錯的主意;這會讓隨機數 發生器有更好的機會獲得足夠的熵。 我們需要生成大量的隨機位元組。在質數生成期間做些其他操作(敲打鍵盤 、移動滑鼠、讀寫硬碟之類的)將會是一個不錯的主意;這會讓隨機數 發生器有更好的機會獲得足夠的熵。 gpg: 密鑰 54EC3C8FA3A5B50F 被標記為絕對信任 gpg: 目錄‘/Users/xxxxxxxxx/.gnupg/openpgp-revocs.d’已創建 gpg: 吊銷證書已被存儲為‘/Users/xxxxxxxxx/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxxxxxxxxxxxxxxx.rev’ 公鑰和私鑰已經生成並被簽名。 pub rsa3072 2021-12-06 [SC] [有效至:2023-12-06] 8BDxxxxxxxxxxxxxxxxxxxxxxxxxxxxB50F uid xxxxxxxx <[email protected]> sub rsa3072 2021-12-06 [E] [有效至:2023-12-06]
秘鑰生成好後,需要你把公鑰上傳到公共伺服器供sonatype驗證。
官網教程里有三個地址可以用:
keyserver.ubuntu.com
keys.openpgp.org
pgp.mit.edu
➜ ~ gpg --keyserver pgp.mit.edu:11371 --send-keys 8BD96B0EA18E5162B94EA7F754EC3C8FA3A5B50F gpg: 正在發送密鑰 54EC3C8FA3A5B50F 到 pgp.mit.edu:11371 gpg: 發送至公鑰伺服器失敗:文件結尾 gpg: 發送至公鑰伺服器失敗:文件結尾 ➜ ~ gpg --keyserver keyserver.ubuntu.com --send-keys 8BD96B0EA18E5162B94EA7F754EC3C8FA3A5B50F gpg: 正在發送密鑰 54EC3C8FA3A5B50F 到 hkp://keyserver.ubuntu.com gpg: 發送至公鑰伺服器失敗:Network is unreachable gpg: 發送至公鑰伺服器失敗:Network is unreachable ➜ ~ gpg --keyserver pgp.mit.edu:11371 --send-keys 54EC3C8FA3A5B50F gpg: 正在發送密鑰 54EC3C8FA3A5B50F 到 pgp.mit.edu:11371 gpg: 發送至公鑰伺服器失敗:文件結尾 gpg: 發送至公鑰伺服器失敗:文件結尾
-
配置setting.xml
setting.xml為Maven的全局配置文件,一般路徑為$MAVEN_HOME/conf/settings.xml
找到Services節點進行如下配置
<servers>
<server>
<id>ossrh</id>
<username>你的Sonatype賬號</username>
<password>你的Sonatype密碼</password>
</server>
</servers>
找到profiles節點進行如下配置,gpg.executable
節點建議配置第二個安裝包安裝的gpg路徑,這一步一定要做不然容易發佈的時候提示找不到gpg。
<profiles>
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>"D:\Program Files (x86)\GnuPG\bin\gpg.exe"</gpg.executable>
<gpg.passphrase>你的密鑰創建時候的密碼</gpg.passphrase>
</properties>
</profile>
</profiles>
配置pom.xml
以下為一些關鍵點的配置示例
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--Maven相關信息配置-->
<name>fluent-validation</name>
<url>https://github.com/yikuaibaiban/fluent-validation</url>
<description>fluent-validation is a streaming validation framework.</description>
<!--Issue 配置-->
<issueManagement>
<system>Github Issue</system>
<url>https://github.com/yikuaibaiban/fluent-validation/issues</url>
</issueManagement>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>https://apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<!--開發人員信息配置-->
<developers>
<developer>
<name>yikuaibaiban</name>
<email>[email protected]</email>
<timezone>+8</timezone>
</developer>
</developers>
<!--scm信息配置-->
<scm>
<url>https://github.com/yikuaibaiban/fluent-validation</url>
<connection>scm:https://github.com/yikuaibaiban/fluent-validation.git</connection>
<developerConnection>scm:git:https://github.com/yikuaibaiban/fluent-validation.git</developerConnection>
</scm>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
<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>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<windowtitle>${project.name}</windowtitle>
<doctitle>${project.name}</doctitle>
<show>private</show>
<detectLinks>false</detectLinks>
<detectOfflineLinks>true</detectOfflineLinks>
<linksource>true</linksource>
<detectJavaApiLink>true</detectJavaApiLink>
<source>8</source>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 以下是GPG -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<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>
</profile>
</profiles>
</project>
發佈到Maven中央倉庫
推送代碼
- 使用命令行發佈
mvn clean deploy -P release
- 使用Idea發佈
後續操作(必須要操作)
此時進入https://s01.oss.sonatype.org
並登錄(登錄的賬號密碼與剛開始註冊的賬號密碼一致)查看發佈好的構件,點擊左側的Staging Repositories。
此時需註意,如果項目中版本信息為1.0.0-SNAPSHOT,即SNAPSHOT為尾碼,則發佈的項目位於Snapshots目錄下。在左上角的Artifact Search中能夠搜到。
如果是Release尾碼,則可直接在Staging Repositories中看到(有可能要稍等一下,等待平臺處理)。
選中對於的repository之後,點擊的close,close時會檢查發佈的構件是否符合要求。若符合要求,則close成功,成功之後點擊箭頭所指的release,即可正式將jar包發佈到Sonatype OSSRH倉庫。
當點擊Release之後,郵件中會收到Issues變化的信息,提示同步已經被激活,正常10分鐘就可以更新同步。
release成功大概2個小時之後,該構件就會同步到Maven中央倉庫,屆時會有郵件通知。
實踐過程中發現十分鐘之內已經成功同步到https://repo1.maven.org/的中央倉庫當中。
逐步的其他Maven倉庫,包括阿裡鏡像都會進行同步。
本文來自博客園,作者:一塊白板,轉載請註明原文鏈接:https://www.cnblogs.com/ykbb/p/17897143.html