掌握 Maven 私服

前言

在 Java EE 開發(fā)中,我們使用 Maven 構(gòu)建工具主要來管理項目的第三方庫的依賴娱颊,以及公司內(nèi)部其他項目服務的依賴申窘。因此 Maven 私服就是必不可少的一環(huán),本文主要對 Maven 私服的三大方面進行介紹:

  • 什么是 Maven 私服
  • 如何搭建 Maven 私服
  • 如何使用 Maven 私服

本文面對的讀者應有 Maven 使用經(jīng)驗榕暇,了解 Maven 的一些基本概念,如果不太熟悉可以參見文末的參考資料學習喻杈。

什么是 Maven 私服

在介紹 Maven 私服之前彤枢,我們首先清楚下什么是 Maven 倉庫。

Maven 倉庫:Maven 統(tǒng)一存儲所有Maven項目依賴筒饰,插件缴啡,以及所上傳項目的地方。

并且 Maven 倉庫還分成兩類:本地倉庫和遠程倉庫瓷们。

  • 本地倉庫业栅,就是我們本地電腦安裝Maven后秒咐,在 配置文件 setting.xml 里 localRepository 所需要指定目錄的那個文件夾。
  • 遠程倉庫碘裕,就是在外部網(wǎng)絡里(包括局域網(wǎng))指定 URL 的專門存放 Java 庫携取,Maven插件等的服務器,帮孔,例如中央倉庫雷滋,就是一個典型的遠程倉庫,它包含了世界上絕大多數(shù)開源的 Java 庫你弦,類似的還有許多其他的公開庫

而本文提到的私服惊豺,就是另一種特殊的遠程倉庫,它通常架設在局域網(wǎng)內(nèi)的一臺服務器上禽作,用于代理所有外部的遠程倉庫尸昧,并且能接受內(nèi)部項目的上傳和獲取。

而這些倉庫又有是什么用呢旷偿?當 Maven 項目需要依賴一些其他項目的 Java 庫時烹俗,Maven 首先會在本地倉庫查找,如果存在對應的庫萍程,就直接使用幢妄;如果本地倉庫不存在,Maven 就會去遠程倉庫查找茫负,找到對應的 Java 庫后下載到本地倉庫再使用蕉鸳,以便于下次需要該Java庫時,直接使用緩存在本地倉庫的依賴庫即可忍法,省去了重復通過網(wǎng)絡查找并下載的時間潮尝,對于 Maven 插件也是同樣的過程。

通常情況下饿序,中央倉庫是Maven 默認的遠程倉庫勉失,而當引入了私服后,本地倉庫查找結(jié)束未找到所需要的依賴庫時原探,就先從私服倉庫開始查找乱凿,仍未找到的話,最后再去中央倉庫查找咽弦,具體過程可以參考下圖:

在這里我們再看下私服的作用有哪些:

  • 內(nèi)網(wǎng)訪問徒蟆,節(jié)省外網(wǎng)帶寬。
  • 一次外網(wǎng)下載型型,內(nèi)網(wǎng)所有用戶就可以只下載私服緩存段审,加速 Maven 項目構(gòu)建。
  • 允許上傳和下載私有庫输莺,并且不被外部訪問戚哎,更加安全。
  • 減少外部網(wǎng)絡因素嫂用,提供項目構(gòu)建的穩(wěn)定性型凳。
  • 方便內(nèi)部項目服務的依賴引用,而不需要其他項目的完整源代碼嘱函。

這里對最后一小點的作用添加下具體描述:當我們有獨立的兩個Maven 項目甘畅,比如訂單服務項目和會員服務項目,其中訂單服務項目需要會員服務往弓,依賴會員服務的 API 包疏唾,通過私服可以將編譯后的會員服務的 API 包上傳,然后訂單服務程序直接下載引用私服上的會員服務 API 包即可函似,這樣就不需要導入會員服務項目代碼槐脏,也不用關(guān)心會員服務具體實現(xiàn)了,起到了內(nèi)部服務項目輕度引用的作用撇寞,描述可參見下圖顿天。

搭建 Maven 私服

了解 Maven 私服之后,我們進一步學習蔑担。我們首先來搭建一個 Maven 私服牌废。在這里我們使用最流行的開源 Maven 倉庫管理軟件 - Nexus,來快速搭建 Maven 私服啤握,傳統(tǒng)的搭建方式為在 Nexus 官網(wǎng)上下載開源版的 Nexus OSS 進行安裝:https://www.sonatype.com/nexus-repository-oss鸟缕。而本文將采用 Docker 方式安裝 Nexus,不僅快速簡單排抬,而占用更少的機器資源懂从。

如果對 Docker 不熟悉的同學,可以參見 10分鐘快速掌握Docker必備基礎知識 學習了解下畜埋,簡單使用 Docker 也是十分容易的莫绣。

下載 Nexus 鏡像

在終端控制臺上使用 Docker 指令下載 Nexus 官方提供的Docker 鏡像:

看到下圖結(jié)果時,就表示鏡像下載完成悠鞍,可以通過 docker images 查看对室。

image-20190825165531217

啟動 Nexus 容器

使用下方指令啟動 Nexus 容器:

在這里對輸入的 Docker 指令的參數(shù)進行簡單的說明:

  • -d 表示讓容器后臺運行。

  • -p 8081:8081 表示了容器啟動時開放內(nèi)部端口 8081(后者的8081) 映射主機端口的 8081 咖祭,即通過 localhost:8081 可以訪問到 Nexus 容器所提供的服務掩宜。

  • -v /Users/One/Desktop/Nexus/nexus-data:/nexus-data 表示將容器內(nèi)部 /var/nexus-data 掛載到當前主機的指定目錄,需要注意的是么翰,-v 指定的外部路徑必須為全路徑牺汤。

  • --restart=always 比較簡單,表示當 docker 服務啟動時浩嫌,該容器也跟著啟動檐迟。

執(zhí)行上述指令后补胚,稍等片刻,訪問 http://localhost:8081/ 追迟,看到對應的 Nexus 后臺就表示私服安裝完成了溶其,是不是很簡單呢。

容器啟動過程中敦间,由于機器配置的不同瓶逃,可能會出現(xiàn)啟動慢的情況,只需耐心等待即可廓块。

啟動完成后厢绝,我們可以在所掛載的本機目錄下查看 Nexus 容器運行產(chǎn)生的文件。

配置 Maven 私服

私服安裝之后带猴,我們首先進行登錄操作昔汉,點擊頁面左上角的 Sign In 按鈕,就會出現(xiàn)和下圖一樣的提示:

說明了 Nexus 默認登錄賬號為 admin拴清,并且密碼位于文件 /nexus-data/admin.password 下挤庇,我們只需在本地配置的掛載目錄下查看該文件即可。

輸入默認的賬號密碼之后成功登錄之后贷掖,Nexus 就會強制要求修改 admin 的密碼,并且設置基本訪問權(quán)限嫡秕,完成之后就正式進入了 Nexus 私服后臺。

這里簡單對界面元素進行介紹:

  1. 默認的瀏覽界面苹威,可以搜索查看倉庫的組件昆咽,以及進行上傳操作。
  2. 用于管理私服程序的配置牙甫。
  3. 賬戶信息查看掷酗,允許修改密碼。

進入私服程序的配置界面窟哺,我們需要對默認配置進行幾點調(diào)整泻轰。

中央倉庫的代理路徑設置

將私服配置里中央倉庫的代理倉庫路徑更新為阿里云倉庫提供的代理地址:https://maven.aliyun.com/repository/central 這樣一來可以更快速地訪問在中央倉庫上所需要的依賴和插件。

新建自定義的倉庫

點擊Create repository,然后選擇類型為 maven2(hosted)

然后輸入倉庫名稱 private-release且轨,并在 Version policy 一欄中選擇 Release浮声,表示這個倉庫的存儲依賴為正式發(fā)布的組件,然后在 Deployment policy 一欄中選擇 Allow redeploy旋奢,允許部署和更新私服上的組件泳挥。

最后點擊藍色按鈕-Create repository 之后,就可以在倉庫列表看到自定義的倉庫了至朗,有了 release 倉庫屉符,我們再按照同樣方式操作添加一個 snapshot 倉庫,只需在 Version policy 一欄調(diào)整為 Snapshot 即可。

添加角色

Nexus 默認只有兩種角色:nx-anonymousnx-admin矗钟,前者只有瀏覽的權(quán)限唆香,后者為管理員權(quán)限,一般情況下吨艇,我們還需要正對開發(fā)人員創(chuàng)建個角色袋马。點擊 Create Role,添加一個 Role ID 為 developer 的自定義角色, 并且只添加自定義倉庫的使用權(quán)限秸应,刪除操作除外。

保存之后碑宴,新增的角色就展示在列表中软啼,有了角色,就可以關(guān)聯(lián)用戶延柠,進行權(quán)限分配了祸挪。

image-20190825190139940

添加用戶

跟權(quán)限類似,默認的用戶只有兩種:adminanonymous贞间,我們同樣需要創(chuàng)建屬于開發(fā)者的用戶對象贿条。點擊 Create local user,填入用戶名增热,密碼等必填信息之后整以,關(guān)聯(lián)我們先前的創(chuàng)建的角色,并保存即可峻仇。

用戶創(chuàng)建完成之后公黑,我們就可以用新的用戶登錄私服,查看對應權(quán)限的內(nèi)容了摄咆,例如我們用新建的用戶登錄凡蚜,所能操作的只有查看和搜索自定義的私服倉庫。

這樣一來我們就創(chuàng)建好了自己的私服倉庫吭从,配置完成之后朝蜘,開發(fā)者就可以在 Maven 項目開發(fā)中使用了。

使用 Maven 私服

有了私服和用于開發(fā)的賬號涩金,我們就需要在本地 Maven 配置文件 setting.xml 進行關(guān)聯(lián)谱醇。

設置 server 賬戶信息:

設置私服倉庫地址:(這里的地址,可以通過 Nexus 后臺上倉庫頁面的 cpoy 按鈕自動復制得到)

Maven 項目部署到私服

配置完成后步做,我們可以創(chuàng)建一個Maven工程枣抱,嘗試下打包到 Maven 私服。利用 IDE 快速生成 Maven 項目辆床,在 POM 文件添加 distributionManagement 節(jié)點佳晶,并且指定對應的私服倉庫 id 和地址,如下:

最后只要執(zhí)行部署命令 mvn clean deploy 或者利用 IDE 的 部署插件即可讼载,當控制臺出現(xiàn) BUILD SUCCESS 轿秧,如下圖類似時則說明部署完成中跌。

從日志上可以看出,我們的項目上傳都了 private- snapshot 倉庫下菇篡,此時我們可以在私服網(wǎng)站上的 private- snapshot 倉庫查看到上傳的 jar漩符。

如果部署過程中出現(xiàn)如下提示:帶有 Access denied to 則說明在 setting.xml 配置的用戶權(quán)限不足,無法將 jar 部署到對應私服倉庫上去驱还。

需要注意的是嗜暴,對于一個Maven項目而言,如果項目的版本號中有 “SNAPSHOT” 字樣议蟆,則表示當前處于開發(fā)版本闷沥,Maven 會將發(fā)布到 snapshotRepository 節(jié)點對應地址上去。否則咐容,Maven則認為這是一個發(fā)布版本舆逃,將程序發(fā)布到 repository 節(jié)點對應的地址上。由于示例項目的版本為 1.0.0-SNAPSHOT 戳粒,所以最終項目上傳到了 private-snapshot 這個 Snapshot 類型的倉庫下路狮。

接下來如果其他項目要依賴這個 jar 時,只需要在其 POM 文件引入對應的坐標即可蔚约。

將第三方 jar 包部署到 Maven 私服

這里說到了第三方 jar 包奄妨,不是平常所提到的開源庫,更多的是來自其他第三方系統(tǒng)的 jar 包苹祟,由于項目需要展蒂,使用項目導入的方式來很不方便,更好的處理方式就是將第三方系統(tǒng)的 jar 包手動上傳到 Maven 私服上苔咪,需要使用的項目直接從私服倉庫中拉取即可锰悼。

這種方式實現(xiàn)起來也比較方便,分為兩種:可視化界面操作和命令行操作团赏。

可視化界面操作:就是在 Nexus 后臺上進去箕般,執(zhí)行上傳操作必須要對于的上傳權(quán)限才可以,一般都是管理員賬號進行操作舔清,選擇倉庫后進去上傳頁面丝里,指定本地需要上傳的項目,自定義完坐標信息保存即可体谒。

命令行方式:直接在終端輸入下面指令即可:
  • -DgroupId 和 -DartifactId 構(gòu)成了該jar包在 pom.xml 的坐標杯聚, 即對應依賴的 groupIdartifactId
  • -Dfile 表示需要上傳的jar包的絕對路徑
  • -Durl 為私服倉庫的url精確地址
  • -DrepositoryId 為私服倉庫定義的id
  • -Dversion 指定了版本號
  • -Dpackaging 指定了打包方式

當控制臺日志出現(xiàn) BUILD SUCCESS 信息時則表示打包成功,如果出現(xiàn)打包失敗抒痒,很有可能是 Maven 配置文件里 server 元素下的用戶權(quán)限不足導致幌绍,需要 Nexus 后臺對用戶角色進行上傳權(quán)限的分配。

結(jié)語

在 Java 企業(yè)級項目開發(fā)中,建立并維護私服是使用 Maven 必不可少的一步傀广,本文從 Maven 的簡單介紹颁独,到快速搭建和使用來進一步掌握 Maven 私服,為后續(xù)的企業(yè)微服務架構(gòu)做好鋪墊伪冰。

推薦閱讀

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贮聂,一起剝皮案震驚了整個濱河市靠柑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吓懈,老刑警劉巖歼冰,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骄瓣,居然都是意外死亡,警方通過查閱死者的電腦和手機耍攘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門榕栏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕾各,你說我怎么就攤上這事扒磁。” “怎么了式曲?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵妨托,是天一觀的道長。 經(jīng)常有香客問我吝羞,道長兰伤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任钧排,我火速辦了婚禮敦腔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恨溜。我一直安慰自己符衔,他們只是感情好,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布糟袁。 她就那樣靜靜地躺著判族,像睡著了一般。 火紅的嫁衣襯著肌膚如雪项戴。 梳的紋絲不亂的頭發(fā)上形帮,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天,我揣著相機與錄音,去河邊找鬼沃缘。 笑死躯枢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的槐臀。 我是一名探鬼主播锄蹂,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼水慨!你這毒婦竟也來了得糜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤晰洒,失蹤者是張志新(化名)和其女友劉穎朝抖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谍珊,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡治宣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砌滞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侮邀。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贝润,靈堂內(nèi)的尸體忽然破棺而出绊茧,到底是詐尸還是另有隱情,我是刑警寧澤打掘,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布华畏,位于F島的核電站,受9級特大地震影響尊蚁,放射性物質(zhì)發(fā)生泄漏亡笑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一横朋、第九天 我趴在偏房一處隱蔽的房頂上張望况芒。 院中可真熱鬧,春花似錦叶撒、人聲如沸绝骚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽压汪。三九已至,卻和暖如春古瓤,著一層夾襖步出監(jiān)牢的瞬間止剖,已是汗流浹背腺阳。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穿香,地道東北人亭引。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像皮获,于是被迫代替她去往敵國和親焙蚓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容