POM表明「項目對象模型」。它是一個名爲pom.xml的文件,是Maven項目的XML表示形式。 在Maven眼中,一個項目根本不須要包含任何代碼,只須要一個pom.xmlmysql
這是直接位於project元素下的元素列表sql
請注意,modelVersion 爲 4.0.0 這是目前惟一支持Maven 2和3的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>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
複製代碼
<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>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
複製代碼
上面定義的POM是Maven容許的最小值。groupId、artifactId、version是必填字段,他們三者構成了 maven 的惟一座標。apache
<groupId>
: 組織id,推薦公司域名反寫,例如com.ailibaba<artifactId>
:項目名稱<version>
:版本號經過座標咱們在maven中定義了一個項目,除此以外咱們還須要告訴maven咱們要如何打包這個項目tomcat
<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">
...
<packaging>war</packaging>
...
</project>
複製代碼
如上,咱們指定打包方式爲 war
包,經常使用的還有jar
包bash
Maven的一個強大功能是它處理項目關係:這包括依賴項(和傳遞依賴項),繼承和聚合(多模塊項目)oracle
若是你的項目須要依賴其餘項目,就必須配置依賴框架
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
...
</project>
複製代碼
不是全部依賴項均可以在 maven 倉庫中找到,要配置這種依賴,可使用install插件在本地安裝。maven
mvn install:install-file -Dfile = c:\\non-maven-proj.jar -DgroupId = some.group -DartifactId = non-maven-proj -Dversion = 1 -Dpackaging = jar
複製代碼
scope 有兩個做用ide
做用範圍
包括項目的測試、編譯、運行、打包等生命週期。其中,編譯和運行還分爲
scope 的五個可選值,分別是
compile :這是默認範圍,參與編譯、測試、運行、打包等生命週期,可傳遞
provided :參與編譯、測試、運行,不參與打包,不可傳遞。依賴由運行的環境提供,好比tomcat或者基礎類庫等
runtime :不參與編譯,參與測試、運行,可傳遞。好比JDBC類庫,在編譯之時僅依賴相關的接口,在具體的運行之時,才須要具體的mysql、oracle等等數據的驅動程序。
test 該依賴僅參與測試用例的編譯和執行,不可傳遞,好比Junit。
system :範圍依賴與provided 類似,但依賴項不會從maven倉庫下載,而是從本地系統指定路徑下尋找,須要 systemPath 屬性。
傳遞依賴
A -> B -> C, 當前項目 A,A依賴於B,B依賴於C,知道B在 A中的scope,怎麼知道 C在 A 中的 scope
即,A需不須要 C的問題,本質由 C在B中的scope決定
當 C 在 B 中的scope 是test 或 provided 時,C 直接被丟棄,A不依賴C
不然 A 依賴 C,C的scope 繼承與B 的scope
optional 表示可選依賴,它的值有兩種
在Maven中可選依賴是不會進行傳遞的
什麼是可選依賴? 假如A依賴B,B中有可選依賴C,那麼除非A顯示聲明,不然可選依賴包是不會導入進依賴的。
爲何要有可選選依賴?
好比,一個持久層模塊不但能夠持久化Oracle數據庫,也能夠持久化Mysql數據庫,那麼在這個持化層框架中應該對應了兩份代碼,一份是關於Oracle持久化的處理,一份是關於Mysql持久化的處理,若是將持久層模塊的Oracle與Mysql驅動均設置爲非可選依賴,那麼依賴這個持久層框架的項目類路徑中將同時出現Mysql以及Oracle的驅動Jar包,若是真的這樣,你會不會感受到這種設計很奇葩,所以Maven經過Optional關鍵字來處理這種問題