Maven實戰:pom.xml與settings.xml

pom.xml與settings.xml

pom.xml與setting.xml,可以說是Maven中最重要的兩個配置文件,決定了Maven的核心功能,雖然之前的文章零零碎碎有提到過pom.xml和settings.xml里面的內容,但都是大略帶過,學習與研究地并不細致,本文的目的就是詳細研究下這兩個Maven重要的配置文件,從這兩個配置文件可以牽出非常多的Maven話題。

?

Maven坐標

首先談一下為什么要使用Maven坐標。

Maven世界擁有數量非常巨大的構件,也就是平時使用的一些jar、war等文件,在Maven為這些構件引入坐標概念之前,我們無法使用任何一種方式來唯一標識所有這些構件。因此,如果需要使用Spring依賴,那么就去Spring官網尋找;如果需要使用log4j依賴,那么又去Apache官網尋找。又因為各個網站風格迥異,大量時間花費在了搜索和瀏覽網頁的工作上。沒有統一規范與法則,工作就無法自動化,重復性的勞動本來就應該交給機器來做

Maven定義了這樣一組規則:世界上任何一個構件都可以使用Maven坐標唯一標識,Maven坐標元素包括groupId、artifactId、version、packaging、classifier,現在只要我們提供正確的元素坐標,Maven就能找到對應的構件。至于去哪里下載,Maven本身內置了一個中央倉庫的地址"http://repo1.maven.org/maven2",該中央倉庫包含了世界上絕大部分流行的開源項目構件,Mavne會在需要的時候去那里下載,當然也可以配置自己的中央倉庫地址,去自己的中央倉庫下載構件。

舉個例子,Spring的context:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.6.RELEASE</version>
</dependency

看一下下屬的各個元素:

  • groupId:定義當前Maven項目隸屬的實際項目。由于Maven項目和實際項目未必是一對一的關系,比如SpringFramework這個實際項目可能對應的Maven項目有很多,像core、context、expression等等,因此groupId不應該對應項目隸屬的公司或組織,否則artifact將很難定義
  • artifactId:定義實際項目中的一個Maven模塊,推薦的做法是使用實際項目名稱作為artifactId的前綴,這樣會很方便去尋找實際構件
  • version:定義Maven項目當前所處的版本,如上面的spring-context就是4.2.6的,RELEASE表示正式發行版本
  • packing:定義Maven項目的打包方式,這項不是必須的,沒列出來,不定義默認就是jar的打包方式
  • classifier:幫助定義構件輸出的一些附屬構件,比如xxx-javadoc.jar、xxx-sources.jar,附屬構件與主構件對應,這項是不能直接定義的

Maven坐標的概念大致上就是這樣,理解Maven坐標,是理解Maven很重要的一步。

?

傳遞性依賴

什么是傳遞性依賴,以Spring舉一個例子。使用Spring的時候會依賴于其他開源的類庫,此時有兩種做法:

1、下載一個很大的.zip包,里面包含了所有Spring的jar,但是這么做往往就引入了許多不必要的依賴

2、只下載spring相關的.zip包,不包含依賴,實際使用的時候根據出錯信息,加入需要的其他依賴

顯然這兩種做法都非常麻煩,Maven的傳遞性依賴機制很好地解決了這一問題。打開spring-core-4.1.0.RELEASE的pom.xml,我截取一段關鍵部分:

<dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version><scope>compile</scope><optional>true</optional></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version><scope>compile</scope></dependency>...
</dependencies>

比如A項目依賴了spring-core,spring-core又依賴了commons-codec和commons-logging,那么commons-codec和commons-logging就是A項目的一個傳遞性依賴。有了傳遞性依賴機制,在使用spring-core的時候就不用去考慮它依賴了什么,也不用擔心引入多余的依賴,Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到當前的項目中去。

有了傳遞性依賴機制,一方面大大簡化和方便了依賴聲明,另一方面在大部分情況下我們只需要關心項目的直接依賴是什么而不用考慮這些直接依賴會引入什么傳遞性依賴,不過有時候傳遞性依賴也會有一些問題,此時我們就需要清除地知道該傳遞性依賴是從哪條路徑引入的,這就叫依賴調解,依賴調解主要有兩點原則:

1、A->B->C->X(1.0),A->D->X(2.0),此時兩條依賴路徑上有兩個版本的X,此時遵循路徑最近者優先,因此X(2.0)將被解析使用

2、A->B->Y(1.0),A->C->Y(2.0),Y(1.0)和Y(2.0)的依賴長度是一樣的,從Maven2.0.9開始,此時遵循第一聲明者優先,即順序最靠前的那個依賴優先

?

排除依賴

傳遞性依賴會給項目隱式地引入很多依賴,這極大地簡化了項目依賴的管理,但是有時候這種特性也會帶來問題。比如有種情況:

當前項目依賴A,A由于某些原因依賴了另外一個類庫的SNAPSHOT版本,那么這個SNAPSHOT就會成為當前項目的傳遞性依賴,二SNAPSHOT的不穩定性將直接影響到當前的項目,此時就需要排除該SNAPSHOT,并且在當前項目中聲明該類庫的某個正式發布的版本

排除依賴很簡單,看一下寫法:

<dependency><groupId>com.alibaba.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>3.2.7</version><exclusions><exclusion><groupId>apache-lang</groupId><artifactId>commons-lang</artifactId></exclusion></exclusions>
</dependency>

這里我引入了rocketmq的依賴,但是我不想依賴rocketmq里面的apache-lang,而想要自己引入依賴,所以我就把apache-lang給排除了。

這里需要注意的是,聲明exclusion的時候只需要groupId和artifactId即可,而不需要version元素,這是因為只需要groupId和artifactId就能唯一定位依賴圖中的某個依賴。換句話說,Maven解析后的依賴中,不可能出現groupId和artifactId相同,但是version不同的兩個依賴。

?

settings.xml

settings.xml里面是Maven的基本配置,元素比較多,逐一看一下

1、proxy

proxy表示Maven的代理,看一下寫法:

<proxies><proxy><id>optional</id><active>true</active><protocol>http</protocol><username>proxyuser</username><password>proxypass</password><host>proxy.host.net</host><port>80</port><nonProxyHosts>local.net|some.host.com</nonProxyHosts></proxy>
</proxies>

需要proxy是因為很多時候你所在的公司基于安全因素考慮,要求你使用通過安全認證的代理訪問因特網。這種情況下,就需要為Maven配置HTTP代理,才能讓它正常訪問外部倉庫,以下載所需要的資源。proxies下可以配置多個proxy元素,如果聲明了多個proxy元素,則默認情況下第一個被激活的proxy會生效。active為true表示激活該代理,protocol表示使用的代理協議,當然最重要的是指定正確的主機名(host)和端口(port),如果代理服務器需要認證則配置username和password,nonProxyHost元素表示指定哪些主機名不需要代理,可以用"|"分隔多個主機名,也支持通配符"*"。

2、repository

repository表示Maven的中央倉庫,因為盡管默認的遠程倉庫中的構件非常龐大,但是總歸會有不滿足我們需求的時候,這時候就要用到別的中央倉庫了。看一下寫法:

<repository>
    <id>public</id><name>local private nexus</name><url>http://192.168.1.6:8081/nexus/content/groups/public</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots>
</repository>

可以聲明多個repository。id必須是唯一的,尤其注意,Maven自帶的中央倉庫使用的id為central,如果其他倉庫聲明也用該id,就會覆蓋中央倉庫的配置。releases和snapshots比較重要,前者表示開啟倉庫的發布版本下載支持,后者表示關閉倉庫的快照版本下載支持,這樣一來,Maven就會去倉庫下載發布版本的構件而不會下載快照版本的構件了。

3、server

大部分遠程倉庫無須認證就可以訪問,但是有時候處于安全方面的因素考慮,需要提供認證信息才能訪問一些遠程倉庫,處于安全考慮,認證信息一般只放在settings.xml中,server就是認證元素。看一下配置:

<server><id>nexus-releases</id><username>deployment</username><password>deployment</password>
</server>

這里的關鍵是id,這個id必須與需要認證的repository元素的id完全一致才行,換句話說,正式這個id將認證信息和倉庫配置聯系在了一起。

4、mirror

如果倉庫X可以提供倉庫Y存儲的所有內容,那么就可以認為倉庫X是倉庫Y的一個鏡像(mirror),換句話說,任何一個可以從Y中獲取到的構件夠可以從X中獲取到。舉個例子,"http://maven.net.cn/content/groups/public/"是中央倉庫"http://repo1.maven.org/maven2/"在中國的鏡像,由于地理位置的因素,該鏡像往往能夠提供比中央倉庫更快的服務,這就是為什么要使用mirror的原因。

看一下mirror的配置:

<mirror><id>nexus</id><name>internal nexus repository</name><url>http://192.168.1.6:8081/nexus/content/groups/public</url>
    <mirrorOf>*</mirrorOf>
</mirror>

該例子中,mirrof為*,表示該配置為所有中央倉庫的鏡像,任何對于中央倉庫的請求都會轉至該鏡像。另外三個元素id、name、url與一般倉庫配置無異,表示該鏡像倉庫的唯一標識符、名稱以及地址。類似的,如果該鏡像需要認證,也可以基于該id配置倉庫認證。

轉載于:https://www.cnblogs.com/xrq730/p/5530069.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之靠譜的把圖片和視頻插入手機系統相冊

1 需求 把圖片和視頻插入手機系統相冊,網上查了下基本上很亂,沒幾個靠譜的。 2 結果爆照 3 思路 圖片插入系統相冊(可以直接插入系統相冊,但是我這里多做了一步就是先把圖片拷貝到了一個目錄再插入系統相冊) 視頻插入系統相冊(先把視頻拷貝到MIUI目錄,然后再…

【專升本計算機】計算機操作系統練習題(選擇判斷名詞解釋簡答)

一、填空 1. 操作系統為用戶提供三種類型的使用接口,它們是 命令方式 和 系統調用 和 圖形用戶界面 。 2. 主存儲器與外圍設備之間的數據傳送控制方式 ( I/O 控制方式) 有 程序直接控制、中斷驅動方式、 DMA 方式 和 通道控制方式。 3. 在響應比最高者優先的作業調…

C# WPF 實現Tab頁動態增減

概述Tab頁面是一個很常用的控件&#xff0c;針對頁面固定的場景&#xff0c;直接給Item進行數據綁定就行&#xff0c;如下所示&#xff1a;<dx:DXTabControl cal:Message.Attach"[Event Loaded][TabControl_Loaded($source,$eventArgs)]"><dx:DXTabItem Hea…

2014 網選 上海賽區 hdu 5047 Sawtooth

題意&#xff1a;求n個M型的折線將一個平面分成的最多的面數&#xff01; 思路&#xff1a;我們都知道n條直線將一個平面分成的最多平面數是 An An-1 n1 也就是f(n) (n*n n 2)/2 對于一個M型的折線呢&#xff1f;它有四條線&#xff0c;但是由于三個頂點的關系導致劃分的平…

二、基礎(IVX快速開發手冊)

二、基礎 通過本節你將了解 iVX 所支持應用的創建方法。 文章目錄二、基礎2.1 iVX 線上集成環境進入2.2 創建項目2.3 選擇項目類型2.3.1 WebApp/小程序/原生應用2.3.2 微信小游戲2.3.3 微信小程序&#xff08;原生組件&#xff09;2.1 iVX 線上集成環境進入 點擊 連接 或通過…

【專升本計算機】經典Office 2003專升本復習題(Word、Excel、PowerPoint)

經典Office 2003專升本復習題(Word、Excel、PowerPoint) 一、Word 2003 1. 啟動 Word 是指: 將 Word 從硬盤中調入主存執行 2. 菜單欄: 文件( F )、編輯( E )、視圖( V )、插入( I )、格式( O )、工具( T )、表格( A )、窗口( W )、幫主( H ) 3. …

Android之TabLayout+ViewPager2+FragmentStateAdapter實現帶數字變化的TAB選項

1 問題 TabLayout+ViewPager2實現帶數字變化的TAB選項,然后左邊滑動或者點擊上面的Tab切換fragment不能刷新 2 結果爆照 3 代碼實現 layer_tab_indicator.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="h…

slq2000數據庫升級到sql2012

看到標題&#xff0c;估計有同行笑了&#xff0c;這年代還有用sql2000的&#xff1f;真的有&#xff0c;最近單位服務器數據遷移升級&#xff0c;將數據庫遷移到新服務器后&#xff0c;發現數據全是2000的&#xff0c;無法直接導入到sql2012。沒辦法&#xff0c;只能先將數據庫…

電腦網頁打不開但qq能上解決方法

2019獨角獸企業重金招聘Python工程師標準>>> 問題描述&#xff1a; 電腦網頁打不開但qq能上。 問題原因&#xff1a; 是由于電腦系統的DNS解析出了問題。 解決方法&#xff1a; 首先在鍵盤上同時按下 winR 然后在彈窗中輸入cmd &#xff0c; 再按enter鍵&#xf…

【專升本計算機】計算機權威復習題(基礎知識、操作系統、計算機網絡)

一、計算機基礎知識 1. 第一臺計算機: ENIAC “埃尼阿克”, 1946 年 2 月 14 日 2. 信息社會的基礎是 計算機 、通信、信息的組織與處理,其中前者為核心 4. 計算機的組成: 運算器、控制器、存儲器、輸入設備、輸出設備 5. 隨機存儲器( RAM ): 可讀寫,寫…

基于Linux命令行KVM虛擬機的安裝配置與基本使用

背景由于生產環境的服務器并不會安裝桌面環境&#xff0c;簡單操作的圖形化安裝也不適合批量部署安裝。因此&#xff0c;我還是更傾向于在命令下安裝配置KVM虛擬機。結合了一些資料和個人使用的狀況&#xff0c;我大致列出了一些基本和常用的使用方法。 安裝配置一、環境介紹操…

四、WebApp 基礎可視組件(IVX 快速開發教程)

四、基礎可視組件 通過本節你將了解 iVX 開發中的核心—— iVX 組件的使用方法。iVX 的組件是開發應用時所必要的對象&#xff0c;通過這些對象你將快速的完成應用的開發。 在 iVX 應用開發中&#xff0c;所有交互、動畫、數據都需要以組件為基礎&#xff0c;通過組件之間的編…

Springboot項目搭建(三)整合thymeleaf模板

springboot整合thymeleaf模板 一、POM文件添加依賴 <!--thymeleaf--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency><!--nekohtml 解決thymea…

React-引領未來的用戶界面開發框架-讀書筆記(一)

這本書的主要內容都是以react v0.12為主&#xff0c;ES5語法&#xff0c;筆記中將會使用react v0.14和RS6。 第1章 react簡介 1.本質上是一個狀態機&#xff0c;它以精簡的模型管理復雜的隨著時間而變化的狀態。 2.它不是model-view-controller&#xff0c;它是mvc中的v(view)&…

Android之提示This version of Android Studio cannot open this project, please retry with Android Studio

1 問題 編譯項目&#xff0c;錯誤提示如下 This version of Android Studio cannot open this project, please retry with Android Studio 2 解決辦法 很明顯&#xff0c;看英語翻譯也知道&#xff0c;是由于AS版本太低導致&#xff0c;升級AS就可以了。

Netflix 的 API 架構演變歷程

Netflix 以其松耦合和高度可擴展的微服務架構而聞名&#xff0c;Netflix API 的后端架構經歷了 4 個主要階段。&#x1d40c;&#x1d428;&#x1d427;&#x1d428;&#x1d425;&#x1d422;&#x1d42d;&#x1d421; &#x1d40c;&#x1d428;&#x1d427;&#x1d…

五、Web App 基礎可視組件屬性(IVX 快速開發教程)

五、基礎可視組件屬性 在 iVX 中各個組件存在不同的屬性&#xff0c;這些屬性用于設置顯示的樣式或者是自身具備的特征等&#xff0c;通過更改這些屬性可以極大的方便我們進行項目的創作。 大多數組件都擁有相同的屬性&#xff0c;相同屬性在以下內容中不會贅述介紹&#xff…

【專升本計算機】甘肅省專升本考試計算機熱點考點(填空題115道)

甘肅專升本考試計算機填空題熱點考點 1 、自計算機問世至今已經經歷了四個時代,劃分時代的主要依據是計算機的構成元件。 2 、世界上第一臺電子數字計算機采用的邏輯元件是電子管。 3 、早期的計算機體積大、耗能高、速度慢,其主要原因是制約于元器件。 4 、當前的計算機一…

【回溯法】競賽游戲

題目描述 某游戲規則中&#xff0c;甲乙雙方戰斗&#xff0c;每一回合總能分出勝負&#xff0c;游戲規定&#xff1a; 1.失敗的一方要將自己體力值的1/4加給勝利的一方。 2.游戲開始時&#xff0c;甲的體力值是1000&#xff0c;乙的體力值是2000。 3.每一回合&#xff0c;甲乙勝…

zabbix自動發現(Discovery)功能使用

隨著監控主機不斷增多&#xff0c;有的時候需要添加一批機器&#xff0c;特別是剛用zabbix的童鞋 需要將公司的所有服務器添加到zabbix&#xff0c;如果使用傳統辦法去單個添加設備、分組、項目、圖像…..結果應該是讓人吐的結果。 鑒于這個問題我們可以好好利用下Zabbix大…