settings.xml
settings.xml是maven的全局配置文件
settings.xml文件一般存在于兩個位置:
1.全局配置: {user.home}/.m2/settings.xml
用戶配置優先級高于全局配置
頂級標簽
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<!--構建系統本地倉庫的路徑,默認值是~/.m2/repository -->
<interactiveMode/>
<!--表示maven是否需要和用戶交互以獲得輸入(默認為true),如果需要則設置為true == <interactiveMode>true</interactiveMode> -->
<usePluginRegistry/>
<!--表示maven是否需要使用plugin-registry.xml文件來管理插件版本(默認為false),如果需要讓maven使用文件~/.m2/plugin-registry.xml來管理插件版本,則設為true -->
<offline/>
<!--表示maven是否需要在離線模式下運行,默認為false-->
<pluginGroups/>
<!--當插件的組織id(groupId)沒有顯式提供時,供搜尋插件組織Id(groupId)的列表-->
<servers/>
<!--一般,倉庫的下載和部署是在pom.xml文件中的repositories和distributionManagement元素中定義的。然而,一般類似用戶名、密碼(有些倉庫訪問是需要安全認證的)等信息不應該在pom.xml文件中配置,這些信息可以配置在settings.xml中-->
<mirrors/>
<!--為倉庫列表配置的下載鏡像列表-->
<proxies/>
<!--用來配置不同的代理-->
<profiles/>
<!--根據環境參數來調整構建配置的列表,它包含了id、activation、repositories、pluginRepositories和 properties元素,如果一個settings.xml中的profile被激活,它的值會覆蓋任何其它定義在pom.xml中帶有相同id的profile-->
<activeProfiles/>
<!--該元素包含了一組activeProfile元素,每個activeProfile都含有一個profile id。任何在activeProfile中定義的profile id,不論環境設置如何,其對應的 profile都會被激活。如果沒有匹配的profile,則什么都不會發生-->
</settings>
二級標簽
profile標簽
pom
pom作為項目對象模型。通過xml表示maven項目,使用pom.xml來實現。主要描述了項目:包括配置文件;開發者需要遵循的規則,缺陷管理系統,組織和licenses,項目的url,項目的依賴性,以及其他所有的項目相關因素。
pom.xml
一級標簽
</groupId>
<!--項目或者組織的唯一標志-->
</artifactId>
<!--項目的通用名稱-->
</version>
<!--項目的版本-->
</packaging>
<!--打包機制,例如pom jar等-->
<!--groupId,artifactId,version,packaging作為項目唯一坐標-->
</classifier>
<!--分類-->
</url>
<!--開發團隊官方地址,非必要-->
</dependencies >
<!--所有生命在dependencies里的依賴都會自動引入,并默認被所有的子項目繼承-->
</dependencyManagement>
<!--在我們項目頂層的POM文件中,我們會看到dependencyManagement元素。通過它元素來管理jar包的版本,從而控制所有子項目的依賴項的版本統一,所以讓子項目中引用一個依賴可以不用顯示的列出版本號,maven會根據父子關系向上尋找一個dependencyManagement中存在這個依賴項并獲取版本信息-->
dependencies與dependencyManagement 的區別:
dependencyManagement僅僅是聲明依賴并不會真正地注入,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項,并且version和scope都讀取自父pom,但是如果子項目中已經指定了version則不會向上尋找而直接使用該版本的jar。
二級標簽
dependency
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<type >jar</ type >
<optional >true</ optional >
</exclusions>
</dependency>
groupId,artifactId,version,packaging定義了一個具體的依賴項
optional:設置指依賴是否可選,默認為false,即子項目默認都繼承,為true,則子項目必需顯示的引入,與dependencyManagement里定義的依賴類似
exclusions:如果X需要A,A包含B依賴,那么X可以聲明不要B依賴,只要在exclusions中聲明exclusion
scope:用來指定當前包的依賴范圍
- compile(編譯范圍),是默認的范圍,編譯范圍依賴在所有的classpath中可用,同時它們也會被打包。
- provided(已提供范圍),只有在當JDK或者一個容器已提供該依賴之后才使用。
- runtime(運行時范圍),在運行和測試系統的時候需要。
- test(測試范圍),在一般的 編譯和運行時都不需要。
- system(系統范圍),與provided類似
在dependencyManagement中的dependency可以使用scope=import來解決pom單繼承問題,即可以將雜亂冗長的parent 分成多個model
pom關系
- 依賴關系:就是一個dependency
- 繼承關系:子pom與父pom的關系,父pom用來進行統一的版本關系,注意此時packaging必須為pom
- 聚合關系:
總pom
<modules>
<!-- 這里配置的不是artifactId,而是這個模塊的目錄名稱-->
<module>module-1</module>
<module>module-2</module>
<module>module-3</module>
</modules>
子pom
<!-- 聲明總項目的坐標 -->
<parent>
<groupId>org.clf.parent</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
</parent>
繼承與聚合都屬于父子關系, 不同的是對于聚合模塊來說,它知道有哪些被聚合的模塊,但那些被聚合的模塊不知道這個聚合模塊的存在。對于繼承關系的父 POM來說,它不知道有哪些子模塊繼承與它,但那些子模塊都必須知道自己的父 POM是什么,在實際項目中,一個 POM往往既是聚合POM,又是父 POM,它繼承了某個項目,本身包含幾個子模塊,同時肯定會存在普通的依賴關系,就是說,依賴、繼承、聚合這三種關系是并存的