前言
在使用Maven構(gòu)建項目的時候,你是否也有過這樣的思考博烂?
這些Maven依賴都是怎么發(fā)布到Maven中央倉庫供大家使用的玛界?
借由最近正在做的一個API自動化相關(guān)的jar包:
-
api-automation-service
這是一個服務(wù)于API自動化的服務(wù),它基于Spring Boot,封裝了我日常API自動化工作的一些通用類和定制類沦疾,如隨機數(shù)類、日期處理類、JSONObject處理類、JSONArray處理類世舰、TestNg監(jiān)聽類裆馒、TestNg斷言類(包含添加Allure步驟)、自定義TestNg注解類掘托、文件處理類、Header組裝類头岔、測試數(shù)據(jù)讀取類等。
該Jar是我開源API自動化框架个曙、服務(wù)的第一步对雪,目前還在做桑李,等我完成整個API自動化框架靴寂、服務(wù)的開源工作,后續(xù)會推出API自動化框架屡穗、服務(wù)的文章,敬請期待!
接下來我們一起來學(xué)學(xué)如何發(fā)布JAR包到Maven中央倉庫!
發(fā)布JAR到Maven中央倉庫是走工單模式的,也就是說,整個過程就像像在做issue一樣,我們用戶作為PM給Maven官方提交issue掖举,Maven官方會在issue內(nèi)根據(jù)既定的工單規(guī)則指導(dǎo)用戶發(fā)布JAR包到Maven中央倉庫略吨。
整體步驟
1). 創(chuàng)建Git Hub倉庫;
2). 創(chuàng)建工單;
3). 下載、安裝、使用gpg工具;
4). 修改maven相關(guān)配置;
5). 部署JAR暫存至Nexus倉庫;
6). 發(fā)布JAR至Maven中央倉庫碾盐;
7). 使用新發(fā)布后的JAR址儒;
1). 創(chuàng)建Git Hub倉庫
在進行下一步前挖函,我們要先在自己的git hub上先創(chuàng)建好代碼倉庫丧肴,比如我的代碼倉庫:https://github.com/dylanz666/api-automation-service.git因宇,這是因為創(chuàng)建工單時,需要填寫代碼倉庫相關(guān)的信息氮兵!
2). 創(chuàng)建工單
如果已經(jīng)發(fā)布過jar疼进,并且groupId沒有變化的話,那么不需要再創(chuàng)建工單了拧粪,可直接跳到步驟5),工單例子:https://issues.sonatype.org/browse/OSSRH-59878?filter=20651
1). 創(chuàng)建工單(issue)的Sonatype站點:https://issues.sonatype.org/secure/Dashboard.jspa
2. 第一次使用Sonatype翘骂,需要注冊,注冊時注意幾個點:
- 密碼有一定的要求:必須包含一個大寫字母帚豪,一個特殊字符碳竟,必須至少12位;
-
要記得注冊時所填的信息狸臣,如Email,Username,Password瞭亮,因為后續(xù)其他地方還要用到;
注冊Sonatype賬號
3. 注冊完成后登錄固棚,創(chuàng)建issue;
(1). 可選擇直接創(chuàng)建issue统翩,即:Create an issue,或瀏覽Sonatype后此洲,再使用Create功能創(chuàng)建issue厂汗,有使用過Jira同學(xué)的應(yīng)該很熟悉~
(2). 創(chuàng)建issue時有幾個注意點:
- Project:選擇Community Support - Open Source Project Repository Hosting (OSSRH)
- Issue Type:選擇New Project
4. 填寫issue信息;
點擊Next按鈕后,進入填寫issue詳情的頁面呜师,這里要特別注意一下:
- Summary:填寫JAR包名稱娶桦,如:api-automation-service
- Group Id:個人正常填寫com.github.XXX,XXX為github username汁汗,如:com.github.dylanz666衷畦,這是Sonatype建議的,并且Sonatype會在創(chuàng)建完issue后知牌,要求用戶在自己的git hub上創(chuàng)建一個以issue號為倉庫名的倉庫祈争;
- Project URL:項目站點,如:https://github.com/dylanz666/api-automation-service
-
SCM url:項目源碼倉庫角寸,如:
https://github.com/dylanz666/api-automation-service.git
其他內(nèi)容不用填寫菩混,創(chuàng)建Issue后需要等待一小段時間,Sonatype的工作人員審核處理扁藕,速度還是很快的沮峡,一般一個工作日以內(nèi),當(dāng)Issue的Status變?yōu)镽ESOLVED后亿柑,就可以進行下一步操作了邢疙,工作人員會在issue上指導(dǎo)用戶操作。
3). 下載望薄、安裝疟游、使用gpg工具
1. 發(fā)布JAR包到Maven時需要一個簽名過程,這個過程主要是出于安全考慮式矫,使用的具體步驟是:
(1).下載安裝
這個過程還是比較簡單的乡摹,只需要雙擊執(zhí)行下載好的.exe文件,傻瓜式安裝采转,啥也不用改聪廉,gpg下載地址:https://www.gpg4win.org/download.html
(2).生成密鑰
(1).在電腦cmd窗口執(zhí)行命令:gpg --gen-key;
(2).過程中需要填寫名字故慈、郵箱等板熊,其他步驟可以使用默認(rèn)值。提別注意一個叫Passphase的參數(shù)察绷,需要記住干签,這個相當(dāng)于是是密鑰的明文密碼,后續(xù)發(fā)布過程中進行簽名操作的時候會用到拆撼。
(3). 查詢密鑰是否生成:gpg --list-keys
(3).發(fā)送公鑰
(1). 在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995
(4).查詢公鑰是否已發(fā)送
在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995
像下面這樣容劳,即說明公鑰發(fā)送成功:
(順便說下喘沿,該密鑰在我發(fā)布文章時,已被我刪除)
4). 修改maven相關(guān)配置
1. 假設(shè)jar的主要功能已完成竭贩;
2. 修改pom.xml文件蚜印;
(1). 修改個人主頁url;
<url>https://github.com/dylanz666/api-automation-service</url>
這一步用戶設(shè)置個人主頁,不是必須的留量,但做了這一步之后窄赋,未來發(fā)布到中央倉庫,當(dāng)用戶搜索到您的jar時楼熄,就有一個入口可以直接到您的git hub主頁忆绰,或您設(shè)置的個人主頁,如:
(2). 修改pom.xml內(nèi)的配置:
<!-- For pushing jar -->
<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>
<tag>master</tag>
<url>https://github.com/dylanz666/api-automation-service.git</url>
<connection>scm:git:git@github.com:dylanz666/api-automation-service.git</connection>
<developerConnection>scm:git:git@github.com:dylanz666/api-automation-service.git</developerConnection>
</scm>
<developers>
<developer>
<name>dylanz</name>
<email>997604787@qq.com</email>
<organization>dylanz</organization>
</developer>
</developers>
<!-- For downloading jar -->
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</repository>
</repositories>
<!-- For pushing jar -->
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<build>
<plugins>
<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>
<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>
</execution>
</executions>
</plugin>
<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>
</plugins>
</build>
特別注意可岂,需要添加javadoc支持错敢、gpg使用等,上面的配置是我推薦的寫法青柄;
3. 修改settings.xml文件伐债;
(1). 首先如何找到settings.xml文件呢?
使用IDEA可以直接通過IDEA菜單欄File>Settings...>搜索Maven即可致开,如:
(2). 在settings.xml文件內(nèi)profiles節(jié)點下加入節(jié)點:
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg</gpg.executable>
<gpg.passphrase>XXXX</gpg.passphrase>
</properties>
</profile>
其中g(shù)pg.passphrase的值是步驟:3). 下載峰锁、安裝、使用gpg工具中提到要記住的Passphase參數(shù)值双戳;
(3). 在settings.xml文件內(nèi)servers節(jié)點下加入節(jié)點:
<server>
<id>ossrh</id>
<username>XXXX</username>
<password>YYYY</password>
</server>
這里有幾個要注意的點:
- id要與pom.xml中發(fā)布jar節(jié)點內(nèi)使用的id一樣虹蒋,如二者都是ossrh:
<!-- For pushing jar -->
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
-
username和password
正常是指sonatype注冊時的用戶名和密碼,但不知道是由于密碼沒轉(zhuǎn)義還是方式不對飒货,我在發(fā)布時一直報401魄衅,401就是沒權(quán)限莫换,一般就是賬號密碼錯誤竟秫,總之死活沒搞定,有知道的朋友麻煩告訴我一下寂恬,感恩扣墩!
后來我發(fā)現(xiàn)另外一個途徑獲取加密后的用戶名和密碼哲银,可以成功用于發(fā)布:
a. 首先使用sonatype賬號密碼登錄nexus倉庫管理站點:https://oss.sonatype.org/#welcome
b. 找到nexus倉庫管理站點右上角用戶名入口,打開小菜單呻惕,點擊小菜單內(nèi)的Profile荆责,進入Profile菜單管理頁;
c. 在Profile菜單管理頁頂部選擇User Token選項亚脆;
d. 點擊Access User Token按鈕做院,在彈出框中再次輸入用戶名密碼,然后confirm;
e. 復(fù)制User Token窗口中的整個節(jié)點,修改${server}為上述的值键耕,如:ossrh寺滚,保存settings.xml文件;
當(dāng)上述操作都執(zhí)行完畢屈雄,那么準(zhǔn)備工作就完成了玛迄,接下來準(zhǔn)備開始發(fā)布到Nexus暫存;
5). 部署JAR暫存至Nexus倉庫
1. 當(dāng)工作人員在issue上告知我們可以開始發(fā)布了棚亩,如最后一條comment:
其實該條comment對應(yīng)了pom.xml文件內(nèi)的配置:
<!-- For pushing jar -->
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
并且我們的配置工作都完成了之后,我們就開始執(zhí)行發(fā)布命令了虏杰;
2. 發(fā)布命令:
(1). 正常情況下讥蟆,值需要在cmd窗口執(zhí)行命令:
#跑測試
mvn clean deploy
#不跑測試:
mvn clean deploy -Dmaven.test.skip=true
(2). 如果遇到SSL證書問題,如:
我們要忽略SSL證書問題纺阔,可參考我之前寫的文章:
Maven之SSL證書錯誤
(3). 命令執(zhí)行過程中瘸彤,會彈出一個gpg的窗口,輸入前面提到的gpg明文密碼Passphase笛钝,如:
(4). Maven顯示build成功后质况,就可以在Nexus暫存?zhèn)}庫中找到你發(fā)布的jar了!
Nexus暫存?zhèn)}庫地址:https://oss.sonatype.org/#welcome
為了分享玻靡,我再次發(fā)布一次給大家看一下结榄,發(fā)布命令:
mvn clean deploy -Dmaven.test.skip=true -Dmaven.multiModuleProjectDirectory=$MAVEN_HOME -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
-Dmaven.wagon.http.ssl.ignore.validity.dates=true
這個過程不需要等待,部署完成馬上就能在Nexus暫存?zhèn)}庫找到囤捻,然而臼朗,這時候只是暫存在Nexus上,而沒有真正發(fā)布到Maven的中央倉庫中去蝎土,因此在中央倉庫中是找不到的J友啤!誊涯!
6). 發(fā)布JAR至Maven中央倉庫
要想在中央倉庫能夠找到我們的jar挡毅,還需要一步Release流程;
(1). 在Nexus暫存?zhèn)}庫中找到我們的jar暴构,選中jar跪呈,點擊jar上方的Close按鈕;
(2). 在彈出的Close Confirmation窗口隨便填寫一些信息丹壕,然后點擊Confirm即可進入預(yù)Release流程庆械,如:
(3). 這時可以查看底部狀態(tài)菜單欄的Activity菜單,這里頭顯示了Close操作在做的動作(其中包括前面提到的javadoc)菌赖,直到所有動作都完成缭乘,jar頂部的Release按鈕就會變成可用狀態(tài),這個過程大概會耗費2~3分鐘,可以刷新查看進度堕绩,如:
(4). 點擊頂部Release按鈕策幼,正式Release;
同樣可以在彈出的Release Confirmation窗口隨便填寫一些信息奴紧,然后點擊Confirm即可開始正式Release特姐,如:
當(dāng)然在點擊Release按鈕前,如果想取消本次發(fā)布黍氮,那么可以點擊jar上方的Drop按鈕唐含,刪除暫存的jar,取消本次Release沫浆;
(5). Release過程同樣也大概會耗費2~3分鐘捷枯,可以刷新查看進度;
Release完成后专执,Nexus暫存區(qū)Staging Repositories就找不到暫存的jar了淮捆,可以通過Artifact Search入口或Advanced Search入口查找;
(6). Release完成后本股,還要等2小時左右攀痊,才能在中央倉庫中找到,或者才能被其他項目引用拄显;
- 中央倉庫地址:https://repo.maven.apache.org/maven2
- 我們可以逐層找到自己的jar苟径,如:https://repo.maven.apache.org/maven2/com/github/dylanz666/api-automation-service/
- Sonatype jar中央倉庫搜索站點:https://search.maven.org/
7). 使用新發(fā)布后的JAR
(1). 其他項目中,在pom.xml文件或settings.xml指定鏡像地址凿叠,也可使用國內(nèi)鏡像涩笤,pom.xml中的配置如下:
<!-- For downloading jar -->
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
(2). 在pom.xml文件中的dependencies節(jié)點下增加節(jié)點,如:
<dependency>
<groupId>com.github.dylanz666</groupId>
<artifactId>api-automation-service</artifactId>
<version>1.0.3</version>
</dependency>
(3). cmd窗口使用命令加載新發(fā)布的jar包:
mvn clean install
確認(rèn)發(fā)布完成后盒件,我們最好到Sonatype的issue上comment說我們已經(jīng)Release好了蹬碧,工作人員會幫我們關(guān)掉issue;
到此為止炒刁,我們完成了如何發(fā)布jar到中央倉庫的整個過程恩沽,整個過程總體來說稍微有點復(fù)雜,我們體驗到了開源貢獻者的不容易翔始,加油罗心!
碼字不容易,點贊需積極
謝謝3窍埂2趁啤!