一、使用maven管理項目的有點
可以将項目規範化、自動化、高效化以及強大的可擴充性。
二、pom檔案結構
- project是所有pom.xml的根元素,并且在裡面定義了命名空間和xsd空間
- modelVersion是目前pom模型的版本
- groupId定義目前maven項目隸屬的實際項目
- artifactId定義項目中的某個子產品名稱
- version定義maven項目目前所處的版本号
- packaging定義maven項目打包的方式
- dependencies加入依賴
- dependency 依賴包
- type 依賴類型:依賴類型,預設類型是jar。它通常表示依賴的檔案的擴充名,但也有例外。一個類型可以被映射成另外一個擴充名或分類器。類型經常和使用的打包方式對應,盡管這也有例外。一些類型的例子:jar,war,ejb-client和test-jar。如果設定extensions為true,就可以在plugin裡定義新的類型。是以前面的類型的例子不完整。
- optional 依賴是否可選:預設為false,即子項目預設都繼承,為true,則子項目必需顯示的引入。例如:假設項目A在編譯時需要項目B的代碼,但運作時并不需要項目B,而且我們可能并不需要所有項目都依賴項目B
- exclusions 排除傳遞性依賴:當計算傳遞依賴時,從依賴構件清單裡,列出被排除的依賴構件集。即告訴maven你隻依賴指定的項目,不依賴項目的依賴。也可以使用通配符*排除所有依賴。此元素主要用于解決版本沖突問題.
- groupId 實際項目
- artifactid 子產品
- version 版本
-
scope 依賴範圍:
test測試依賴範圍。隻對測試有效,表明隻在測試的時候需要,在變異和運作時将無法使用此依賴。junit
compile編譯依賴範圍,預設值。對編譯、測試、運作都有效
provided已提供依賴範圍。編譯和測試有效,運作無效。 Servlet-api
runtime運作時依賴範圍,測試和運作有效,編譯無效。 Jdbc
System系統依賴範圍。和provided依賴範圍一緻。
groupId、artifactId、version這三類似于坐标的元素來确定唯一性的,是以這三個元素對于每個依賴多是必須的。
2.2傳遞依賴性
依賴的傳遞性是指:在A 中添加對B 的依賴,在B 中添加對C 的依賴,如果依賴範圍是compile 的,A 不僅會有B 的jar 包,也會有C 的jar 包。如果在C 中添加了某個依賴,那麼根據傳遞性,A 和B 也可以使用C 添加的依賴,而不需要自己再重新引入依賴。傳遞性依賴原則:
a.最短路徑原則:如果A對于依賴路徑中有兩個相同的jar包,那麼選擇路徑短的那個包
b.第一聲明優先原則:如果A對于依賴路徑中有兩個相同的jar包,路徑也相同,那麼依賴寫在前面的優先。
c.可選依賴不會傳遞,如A->B,B->C,B->D,A對B直接依賴,B對C和D是可選依賴,那麼在A中不會引入C和D
2.3傳遞依賴的依賴範圍
假如目前項目為A,A依賴于B,B依賴于C。此時稱A對于B是第一直接依賴,B對于C是第二直接依賴,而A對于C是傳遞性依賴。C在A中的scope。其依賴範圍如下其中最左邊一欄是第一直接依賴,最上面那一欄為第二直接依賴。中間交叉的是傳遞性依賴範圍。
compile | provided | test | runtime | |
compile | compile | - | - | runtime |
provided | provided | provided | - | provided |
runtime | runtime | - | - | runtime |
test | test | - | - | test |
三、倉庫
- 本地倉庫是指存在于我們本機的倉庫,在我們加入依賴時候,首先會跑到我們的本地庫去找,如果找不到則會跑到遠端倉庫中去找。
- 中央倉庫這裡我解釋為供所有本地倉庫下載下傳依賴包的一個倉庫,它是部署在區域網路内的一個倉庫。
- 遠端倉庫是指在中央倉庫找不到的依賴包則會跑到遠端倉庫去下載下傳的倉庫,它需要網際網路來實作依賴包的下載下傳。
四、聚合和繼承
4.1Maven聚合
建構另外一個子產品,通過該子產品建構整個項目的所有子產品。可以實作将各個子產品進行一次編譯,打包,釋出,而不是一個一個子產品進行編譯、打包、釋出。
<modelVersion>4.0.0</modelVersion>
<groupId>org.pango.user</groupId>
<artifactId>user-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>
../user-core
</module>
<module>
../user-log
</module>
<module>
../user-dao
</module>
<module>
../user-service
</module>
</modules>
Package類型為pom,module的值是一個以目前pom為主目錄的相對路徑
4.2繼承
父級别maven的pom檔案中定義相關的常量,依賴,插件。實際項目子產品可以繼承父項目的pom檔案(要求父級别maven項目高度抽象,高度提取公共部分)
<modelVersion>4.0.0</modelVersion>
<groupId>org.pango.user</groupId>
<artifactId>user-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>
../user-core
</module>
<module>
../user-log
</module>
<module>
../user-dao
</module>
<module>
../user-service
</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.10</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>user-dao</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>user-log</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>user-core</artifactId>
<version>${project.version}</version>
</dependency>
。。。。。
子項目繼承通過parent元素繼承父項目中的包,在parent中定義parent項目的坐标以及父項目中pom的相對位置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.pango.user</groupId>
<artifactId>user-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../user-parent/pom.xml</relativePath>
</parent>
<artifactId>user-core</artifactId>
<packaging>jar</packaging>
<name>user-core</name>
<url>http://maven.apache.org</url>
</project>
dependencyManagement中定義的依賴,子項目中聲明出來則表示引用此依賴(不同聲明版本,隻聲明出groupId和artifactId)可以預防不必要的依賴被子類繼承
4.3聚合與繼承的關系
差別:
對于聚合子產品,它知道有哪些被聚合的子產品,但被聚合的子產品不知道這個子產品的存在
對于繼承關系得到父pom來說它不知道有哪些子產品繼承了它,但是子子產品必須知道繼承那個父類
共同點:
聚合pom與繼承關系中的父pom的package都是pom
聚合子產品與繼承關系中的父子產品除了pom之外都沒有實際内容
4.4maven可繼承的pom元素
- groupId :項目組 ID ,項目坐标的核心元素;
- version :項目版本,項目坐标的核心元素;
- description :項目的描述資訊;
- organization :項目的組織資訊;
- inceptionYear :項目的創始年份;
- url :項目的 url 位址
- develoers :項目的開發者資訊;
- contributors :項目的貢獻者資訊;
- distributionManagerment :項目的部署資訊;
- issueManagement :缺陷跟蹤系統資訊;
- ciManagement :項目的持續繼承資訊;
- scm :項目的版本控制資訊;
- mailingListserv :項目的郵件清單資訊;
- properties :自定義的 Maven 屬性;
- dependencies :項目的依賴配置;
- dependencyManagement :醒目的依賴管理配置;
- repositories :項目的倉庫配置;
- build :包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等;
- reporting :包括項目的報告輸出目錄配置、報告插件配置等。
五、maven生命周期
5.1 clean生命周期:在進行真正的建構之前進行一些清理工作。包含三個phase。
1)pre-clean:執行清理前需要完成的工作
2)clean:清理上一次建構生成的檔案
3)post-clean:執行清理後需要完成的工作
注意如果我們直接運作clean指令,pre-clean就會被自動執行。當然如果直接執行post-clean指令前面兩個指令也會被自動執行
5.2 default生命周期:建構的核心部分,重要的phase如下。
1)validate:驗證工程是否正确,所有需要的資源是否可用。
2)compile:編譯項目的源代碼。
3)test:使用合适的單元測試架構來測試已編譯的源代碼。這些測試不需要已打包和布署。
4)Package:把已編譯的代碼打包成可釋出的格式,比如jar。
5)integration-test:如有需要,将包處理和釋出到一個能夠進行內建測試的環境。
6)verify:運作所有檢查,驗證包是否有效且達到品質标準。
7)install:把包安裝到maven本地倉庫,可以被其他工程作為依賴來使用。
8)Deploy:在內建或者釋出環境下執行,将最終版本的包拷貝到遠端的repository,使得其他的開發者或者工程可以共享。
5.3site生命周期:生成項目報告,站點,釋出站點。phase如下
1)pre-site:生成項目站點之前需要完成的工作
2)site:生成項目站點文檔
3)post-site:生成項目站點之後需要完成的工作
4)site-deploy:将項目站點釋出到伺服器