掌握 Maven 私服

来源:https://www.cnblogs.com/one12138/archive/2019/08/28/11426451.html
-Advertisement-
Play Games

前言 在 Java EE 開發中,我們使用 Maven 構建工具主要來管理項目的第三方庫的依賴,以及公司內部其他項目服務的依賴。因此 Maven 私服就是必不可少的一環,本文主要對 Maven 私服的三大方面進行介紹: 什麼是 Maven 私服 如何搭建 Maven 私服 如何使用 Maven 私服 ...


前言

在 Java EE 開發中,我們使用 Maven 構建工具主要來管理項目的第三方庫的依賴,以及公司內部其他項目服務的依賴。因此 Maven 私服就是必不可少的一環,本文主要對 Maven 私服的三大方面進行介紹:

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

本文面對的讀者應有 Maven 使用經驗,瞭解 Maven 的一些基本概念,如果不太熟悉可以參見文末的參考資料學習。

什麼是 Maven 私服

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

Maven 倉庫:Maven 統一存儲所有Maven項目依賴,插件,以及所上傳項目的地方。

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

  • 本地倉庫,就是我們本地電腦安裝Maven後,在 配置文件 setting.xml 里 localRepository 所需要指定目錄的那個文件夾。
  • 遠程倉庫,就是在外部網路里(包括區域網)指定 URL 的專門存放 Java 庫,Maven插件等的伺服器,,例如中央倉庫,就是一個典型的遠程倉庫,它包含了世界上絕大多數開源的 Java 庫,類似的還有許多其他的公開庫

而本文提到的私服,就是另一種特殊的遠程倉庫,它通常架設在區域網內的一臺伺服器上,用於代理所有外部的遠程倉庫,並且能接受內部項目的上傳和獲取。

而這些倉庫又有是什麼用呢?當 Maven 項目需要依賴一些其他項目的 Java 庫時,Maven 首先會在本地倉庫查找,如果存在對應的庫,就直接使用;如果本地倉庫不存在,Maven 就會去遠程倉庫查找,找到對應的 Java 庫後下載到本地倉庫再使用,以便於下次需要該Java庫時,直接使用緩存在本地倉庫的依賴庫即可,省去了重覆通過網路查找並下載的時間,對於 Maven 插件也是同樣的過程。

通常情況下,中央倉庫是Maven 預設的遠程倉庫,而當引入了私服後,本地倉庫查找結束未找到所需要的依賴庫時,就先從私服倉庫開始查找,仍未找到的話,最後再去中央倉庫查找,具體過程可以參考下圖:

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

  • 內網訪問,節省外網帶寬。
  • 一次外網下載,內網所有用戶就可以只下載私服緩存,加速 Maven 項目構建。
  • 允許上傳和下載私有庫,並且不被外部訪問,更加安全。
  • 減少外部網路因素,提供項目構建的穩定性。
  • 方便內部項目服務的依賴引用,而不需要其他項目的完整源代碼。

這裡對最後一小點的作用添加下具體描述:當我們有獨立的兩個Maven 項目,比如訂單服務項目和會員服務項目,其中訂單服務項目需要會員服務,依賴會員服務的 API 包,通過私服可以將編譯後的會員服務的 API 包上傳,然後訂單服務程式直接下載引用私服上的會員服務 API 包即可,這樣就不需要導入會員服務項目代碼,也不用關心會員服務具體實現了,起到了內部服務項目輕度引用的作用,描述可參見下圖。

搭建 Maven 私服

瞭解 Maven 私服之後,我們進一步學習。我們首先來搭建一個 Maven 私服。在這裡我們使用最流行的開源 Maven 倉庫管理軟體 - Nexus,來快速搭建 Maven 私服,傳統的搭建方式為在 Nexus 官網上下載開源版的 Nexus OSS 進行安裝:https://www.sonatype.com/nexus-repository-oss。而本文將採用 Docker 方式安裝 Nexus,不僅快速簡單,而占用更少的機器資源。

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

下載 Nexus 鏡像

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

看到下圖結果時,就表示鏡像下載完成,可以通過 docker images 查看。

image-20190825165531217

啟動 Nexus 容器

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

在這裡對輸入的 Docker 指令的參數進行簡單的說明:

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

  • -p 8081:8081 表示了容器啟動時開放內部埠 8081(後者的8081) 映射主機埠的 8081 ,即通過 localhost:8081 可以訪問到 Nexus 容器所提供的服務。

  • -v /Users/One/Desktop/Nexus/nexus-data:/nexus-data 表示將容器內部 /var/nexus-data 掛載到當前主機的指定目錄,需要註意的是,-v 指定的外部路徑必須為全路徑。
  • --restart=always 比較簡單,表示當 docker 服務啟動時,該容器也跟著啟動。

執行上述指令後,稍等片刻,訪問 http://localhost:8081/ ,看到對應的 Nexus 後臺就表示私服安裝完成了,是不是很簡單呢。

容器啟動過程中,由於機器配置的不同,可能會出現啟動慢的情況,只需耐心等待即可。

啟動完成後,我們可以在所掛載的本機目錄下查看 Nexus 容器運行產生的文件。

配置 Maven 私服

私服安裝之後,我們首先進行登錄操作,點擊頁面左上角的 Sign In 按鈕,就會出現和下圖一樣的提示:

說明瞭 Nexus 預設登錄賬號為 admin,並且密碼位於文件 /nexus-data/admin.password 下,我們只需在本地配置的掛載目錄下查看該文件即可。

輸入預設的賬號密碼之後成功登錄之後,Nexus 就會強制要求修改 admin 的密碼,並且設置基本訪問許可權,完成之後就正式進入了 Nexus 私服後臺。

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

  1. 預設的瀏覽界面,可以搜索查看倉庫的組件,以及進行上傳操作。
  2. 用於管理私服程式的配置。
  3. 賬戶信息查看,允許修改密碼。

進入私服程式的配置界面,我們需要對預設配置進行幾點調整。

中央倉庫的代理路徑設置

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

新建自定義的倉庫

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

然後輸入倉庫名稱 private-release,併在 Version policy 一欄中選擇 Release,表示這個倉庫的存儲依賴為正式發佈的組件,然後在 Deployment policy 一欄中選擇 Allow redeploy,允許部署和更新私服上的組件。

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

添加角色

Nexus 預設只有兩種角色:nx-anonymousnx-admin,前者只有瀏覽的許可權,後者為管理員許可權,一般情況下,我們還需要正對開發人員創建個角色。點擊 Create Role,添加一個 Role ID 為 developer 的自定義角色, 並且只添加自定義倉庫的使用許可權,刪除操作除外。

保存之後,新增的角色就展示在列表中,有了角色,就可以關聯用戶,進行許可權分配了。

image-20190825190139940

添加用戶

跟許可權類似,預設的用戶只有兩種:adminanonymous,我們同樣需要創建屬於開發者的用戶對象。點擊 Create local user,填入用戶名,密碼等必填信息之後,關聯我們先前的創建的角色,並保存即可。

用戶創建完成之後,我們就可以用新的用戶登錄私服,查看對應許可權的內容了,例如我們用新建的用戶登錄,所能操作的只有查看和搜索自定義的私服倉庫。

這樣一來我們就創建好了自己的私服倉庫,配置完成之後,開發者就可以在 Maven 項目開發中使用了。

使用 Maven 私服

有了私服和用於開發的賬號,我們就需要在本地 Maven 配置文件 setting.xml 進行關聯。

設置 server 賬戶信息:

設置私服倉庫地址:(這裡的地址,可以通過 Nexus 後臺上倉庫頁面的 cpoy 按鈕自動複製得到)

Maven 項目部署到私服

配置完成後,我們可以創建一個Maven工程,嘗試下打包到 Maven 私服。利用 IDE 快速生成 Maven 項目,在 POM 文件添加 distributionManagement 節點,並且指定對應的私服倉庫 id 和地址,如下:

最後只要執行部署命令 mvn clean deploy 或者利用 IDE 的 部署插件即可,當控制台出現 BUILD SUCCESS ,如下圖類似時則說明部署完成。

從日誌上可以看出,我們的項目上傳都了 private- snapshot 倉庫下,此時我們可以在私服網站上的 private- snapshot 倉庫查看到上傳的 jar。

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

需要註意的是,對於一個Maven項目而言,如果項目的版本號中有 “SNAPSHOT” 字樣,則表示當前處於開發版本,Maven 會將發佈到 snapshotRepository 節點對應地址上去。否則,Maven則認為這是一個發佈版本,將程式發佈到 repository 節點對應的地址上。由於示例項目的版本為 1.0.0-SNAPSHOT ,所以最終項目上傳到了 private-snapshot 這個 Snapshot 類型的倉庫下。

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

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

這裡說到了第三方 jar 包,不是平常所提到的開源庫,更多的是來自其他第三方系統的 jar 包,由於項目需要,使用項目導入的方式來很不方便,更好的處理方式就是將第三方系統的 jar 包手動上傳到 Maven 私服上,需要使用的項目直接從私服倉庫中拉取即可。

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

可視化界面操作:就是在 Nexus 後臺上進去,執行上傳操作必須要對於的上傳許可權才可以,一般都是管理員賬號進行操作,選擇倉庫後進去上傳頁面,指定本地需要上傳的項目,自定義完坐標信息保存即可。

命令行方式:直接在終端輸入下麵指令即可:

  • -DgroupId 和 -DartifactId 構成了該jar包在 pom.xml 的坐標, 即對應依賴的 groupIdartifactId
  • -Dfile 表示需要上傳的jar包的絕對路徑
  • -Durl 為私服倉庫的url精確地址
  • -DrepositoryId 為私服倉庫定義的id
  • -Dversion 指定了版本號
  • -Dpackaging 指定了打包方式

當控制台日誌出現 BUILD SUCCESS 信息時則表示打包成功,如果出現打包失敗,很有可能是 Maven 配置文件里 server 元素下的用戶許可權不足導致,需要 Nexus 後臺對用戶角色進行上傳許可權的分配。

結語

在 Java 企業級項目開發中,建立並維護私服是使用 Maven 必不可少的一步,本文從 Maven 的簡單介紹,到快速搭建和使用來進一步掌握 Maven 私服,為後續的企業微服務架構做好鋪墊。

推薦閱讀

參考資料

  • Maven入門,讀完這篇就夠了:https://juejin.im/post/5a4a5e2bf265da4322418d7f#heading-2
  • Maven 實戰:https://book.douban.com/subject/5345682/

  • 私服 maven 倉庫命令上傳 jar 包: https://www.jianshu.com/p/ccd7b643624c
  • What is a Maven Repository:https://medium.com/@chris.shellenbarger/what-is-a-maven-repository-6fa22991fad9


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.1 介紹 開發具有一定價值的符號是人類特有的特征。對於人們來說識別這些符號和理解圖片上的文字是非常正常的事情。與電腦那樣去抓取文字不同,我們完全是基於視覺的本能去閱讀它們。 另一方面,電腦的工作需要具體的和有組織的內容。它們需要數字化的表示,而不是圖形化的。 有時候,這是不可能的。有時,我們 ...
  • 概念 (這是我學習過程中的一些總結) JAVA虛擬機記憶體模型 從屬於線程的記憶體區域 JVM的記憶體劃分中,有部分區域是線程私有的,有部分是屬於整個JVM進程;我們將這部分歸為一類。 1.程式計數器(Program Counter Register) 在JVM規範中,每個線程都有自己的程式計數器。這是一 ...
  • 協程 Event事件 python 添加全局變數,修改全局變數,實現一個線程在某一個節點讓下一個線程繼續工作 import time from threading import Thread from threading import current_thread flag = False def ...
  • 一、HashMap HashMap 是線程不安全的。 JDK 1.7 HashMap 採用數組 + 鏈表的數據結構,多線程背景下,在數組擴容的時候,存在 Entry 鏈死迴圈和數據丟失問題。 JDK 1.8 HashMap 採用數組 + 鏈表 + 紅黑二叉樹的數據結構,優化了 1.7 中數組擴容的方 ...
  • Java生產者消費者是最基礎的線程同步問題,java崗面試中還是很容易遇到的,之前沒寫過多線程的代碼,面試中被問到很尬啊,面完回來惡補下。在網上查到大概有5種生產者消費者的寫法,分別如下。 1. 用synchronized對存儲加鎖,然後用object原生的wait() 和 notify()做同步。 ...
  • AIO中的A即Asynchronous,AIO即非同步IO。它是非同步非阻塞的,客戶端的I/O請求都是由OS先完成了再通知伺服器應用去啟動線程進行處理,一般我們的業務處理邏輯會變成一個回調函數,等待IO操作完成後,由系統自動觸發。 在進行讀寫操作時,只需直接調用API的read/write方法即可。這兩 ...
  • 對於一些自學python的讀者來說,從面向對象開始已經算是基礎部分的知識學完了,那麼接下來就是深入的去瞭解和學習面向對象,它能夠使得我們所寫的代碼清晰合理,我在這裡將自己整理的筆記和python愛好者分享,有的地方寫的不好還請大家多多指教! ...
  • 前言 在實際開發項目中,日誌永遠是一個繞不開的話題。本系列文章試圖以slf4j和log4j2日誌體係為例,從源碼角度分析日誌工作原理。 學習日誌框架,首先要熟悉各類日誌框架,這裡推薦兩篇文章,就不再贅述了。 https://www.cnblogs.com/rjzheng/p/10042911.htm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...