如何發(fā)布JAR包到Maven中央倉庫

前言

在使用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
Create an issue

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
issue信息

其他內(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

下載gpg

(2).生成密鑰
(1).在電腦cmd窗口執(zhí)行命令:gpg --gen-key
(2).過程中需要填寫名字故慈、郵箱等板熊,其他步驟可以使用默認(rèn)值。提別注意一個叫Passphase的參數(shù)察绷,需要記住干签,這個相當(dāng)于是是密鑰的明文密碼,后續(xù)發(fā)布過程中進行簽名操作的時候會用到拆撼。
生成密鑰1

(3). 查詢密鑰是否生成:gpg --list-keys

查詢密鑰是否生成

(3).發(fā)送公鑰
(1). 在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995

發(fā)送公鑰

(4).查詢公鑰是否已發(fā)送
在cmd中使用命令:gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 0BAB46D8B68FB302370B506B733EF328AE2C2995
像下面這樣容劳,即說明公鑰發(fā)送成功:

查詢公鑰是否已發(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即可致开,如:

settings.xml

(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菜單管理頁;

Profile

c. 在Profile菜單管理頁頂部選擇User Token選項亚脆;
選擇User Token

d. 點擊Access User Token按鈕做院,在彈出框中再次輸入用戶名密碼,然后confirm;
User Token

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:

可發(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證書問題

我們要忽略SSL證書問題纺阔,可參考我之前寫的文章:

Maven之SSL證書錯誤

(3). 命令執(zhí)行過程中瘸彤,會彈出一個gpg的窗口,輸入前面提到的gpg明文密碼Passphase笛钝,如:

gpg的窗口

(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
發(fā)布成功

Nexus暫存
這個過程不需要等待,部署完成馬上就能在Nexus暫存?zhèn)}庫找到囤捻,然而臼朗,這時候只是暫存在Nexus上,而沒有真正發(fā)布到Maven的中央倉庫中去蝎土,因此在中央倉庫中是找不到的J友啤!誊涯!

6). 發(fā)布JAR至Maven中央倉庫

要想在中央倉庫能夠找到我們的jar挡毅,還需要一步Release流程;

(1). 在Nexus暫存?zhèn)}庫中找到我們的jar暴构,選中jar跪呈,點擊jar上方的Close按鈕;

Close

(2). 在彈出的Close Confirmation窗口隨便填寫一些信息丹壕,然后點擊Confirm即可進入預(yù)Release流程庆械,如:
Close Confirmation

(3). 這時可以查看底部狀態(tài)菜單欄的Activity菜單,這里頭顯示了Close操作在做的動作(其中包括前面提到的javadoc)菌赖,直到所有動作都完成缭乘,jar頂部的Release按鈕就會變成可用狀態(tài),這個過程大概會耗費2~3分鐘,可以刷新查看進度堕绩,如:
Close

(4). 點擊頂部Release按鈕策幼,正式Release;
同樣可以在彈出的Release Confirmation窗口隨便填寫一些信息奴紧,然后點擊Confirm即可開始正式Release特姐,如:
正式Release

當(dāng)然在點擊Release按鈕前,如果想取消本次發(fā)布黍氮,那么可以點擊jar上方的Drop按鈕唐含,刪除暫存的jar,取消本次Release沫浆;

(5). Release過程同樣也大概會耗費2~3分鐘捷枯,可以刷新查看進度;
Release完成后专执,Nexus暫存區(qū)Staging Repositories就找不到暫存的jar了淮捆,可以通過Artifact Search入口或Advanced Search入口查找;

Search

(6). Release完成后本股,還要等2小時左右攀痊,才能在中央倉庫中找到,或者才能被其他項目引用拄显;

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趁啤!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脖镀,一起剝皮案震驚了整個濱河市飒箭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖弦蹂,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肩碟,死亡現(xiàn)場離奇詭異,居然都是意外死亡凸椿,警方通過查閱死者的電腦和手機削祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脑漫,“玉大人髓抑,你說我怎么就攤上這事∮判遥” “怎么了启昧?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劈伴。 經(jīng)常有香客問我,道長握爷,這世上最難降的妖魔是什么跛璧? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮新啼,結(jié)果婚禮上追城,老公的妹妹穿的比我還像新娘。我一直安慰自己燥撞,他們只是感情好座柱,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著物舒,像睡著了一般色洞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冠胯,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天火诸,我揣著相機與錄音,去河邊找鬼荠察。 笑死置蜀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悉盆。 我是一名探鬼主播盯荤,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焕盟!你這毒婦竟也來了秋秤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎航缀,沒想到半個月后商架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡芥玉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年蛇摸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灿巧。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赶袄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抠藕,到底是詐尸還是另有隱情饿肺,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布盾似,位于F島的核電站敬辣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏零院。R本人自食惡果不足惜溉跃,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望告抄。 院中可真熱鬧撰茎,春花似錦、人聲如沸打洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽募疮。三九已至炫惩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阿浓,已是汗流浹背诡必。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搔扁,地道東北人爸舒。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像稿蹲,于是被迫代替她去往敵國和親扭勉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355