POM的全稱是「ProjectObjectModel(項目對象模型)」。html
<projectxmlns="http://maven.apache.org/POM/4.0.0"java
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"web
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">spring
<!--聲明項目描述符遵循哪個POM模型版本。模型自己的版本不多改變,雖然如此,但它仍然是必不可少的,這是爲了當Maven引入了新的特性或者其餘模型變動的時候,確保穩定性。-->apache
<modelVersion>4.0.0</modelVersion>服務器
<!--父項目的座標。若是項目中沒有規定某個元素的值,那麼父項目中的對應值即爲項目的默認值。座標包括groupID,artifactID和version。-->maven
<parent>ide
<!--被繼承的父項目的構件標識符-->性能
<artifactId/>單元測試
<!--被繼承的父項目的全球惟一標識符-->
<groupId/>
<!--被繼承的父項目的版本-->
<version/>
<!--父項目的pom.xml文件的相對路徑。相對路徑容許你選擇一個不一樣的路徑。默認值是../pom.xml。Maven首先在構建當前項目的地方尋找父項目的pom,其次在文件系統的這個位置(relativePath位置),而後在本地倉庫,最後在遠程倉庫尋找父項目的pom。-->
<relativePath/>
</parent>
<!- groupId在一個組織或項目中一般是特有的。例如:(大概、也許)Maven全部artifacts的groupId都使用org.apache.maven。groupId並不必定必須使用點符號,例如,JUnit項目。注意使用點符號的groupId沒必要與項目的包結構相同,但它是一個很好的作法。 -->
<groupId>org.codehaus.mojo</groupId>
<!--artifactId通常是該項目的名字。它和groupID一塊兒標識一個惟一的項目。換句話說,你不能有兩個不一樣的項目擁有一樣的artifactID和groupID;在某個特定的groupID下,artifactID也必須是惟一的。-->
<artifactId>my-project</artifactId>
<!--這是命名的最後一段。groupId:artifactId表示單個項目,但它們沒法描繪具體的版本。如:我想要junit:junit項目今天第四版。version定義當前項目的版本,如:1.0(-SNAPSHOT),SNAPSHOT表示快照,說明該項目還處於開發階段,是不穩定版本;建議version格式爲:主版本.次版本.增量版本-限定版本號-->
<version>1.0-SNAPSHOT</version>
<!--項目產生的構件類型,例如jar、war、ear、pom等等。插件能夠建立他們本身的構件類型,因此前面列的不是所有構件類型。默認值jar。-->
<packaging>jar</packaging>
<!-- ps:
groupId:artifactId:version:packaging在YouTube某些教學視頻也稱爲UUID。
產物是如何儲存在倉庫中的?存放到私服庫時點符號將會被解析成目錄分隔符,SNAPSHOT版本在私服庫中會被解析成8位日期.時分秒毫秒-序號。序號表明第幾回部署。
上面的座標將會被解析成:org/codehaus/mojo/my-project/1.0-SNAPSHOT/my-project-8位日期.時分秒毫秒-序號.jar
特例:若是你編譯源代碼將產物存放到本地倉庫,將保持不變。
-->
<!--該元素描述了項目相關的全部依賴。這些依賴組成了項目構建過程當中的一個個環節。它們自動從項目定義的倉庫中下載。要獲取更多信息,請看項目依賴機制。-->
<dependencies>
<dependency>
<!--依賴的groupID-->
<groupId>org.apache.maven</groupId>
<!--依賴的artifactID-->
<artifactId>maven-artifact</artifactId>
<!--依賴的版本號。能夠配置成肯定的版本號,也能夠配置成版本號的範圍。
(, )不包含 [, ]包含 例如:[3.8,4.0) 表示3.8 - 4.0的版本,可是不包含4.0
-->
<version>3.8.1</version>
<!--依賴類型,默認類型是jar。它一般表示依賴的文件的擴展名,但也有例外。一個類型能夠被映射成另一個擴展名或分類器。類型常常和使用的打包方式對應,儘管這也有例外。一些類型的例子:jar,war,ejb-client和test-jar。若是設置extensions爲true,就能夠在plugin裏定義新的類型。因此前面的類型的例子不完整。-->
<type>jar</type>
<!--依賴的分類器。分類器能夠區分屬於同一個POM,但不一樣構建方式的構件。分類器名被附加到文件名的版本號後面。例如,若是你想要構建兩個單獨的構件成JAR,一個使用Java1.4編譯器,另外一個使用Java6編譯器,你就可使用分類器來生成兩個單獨的JAR構件。-->
<classifier></classifier>
<!--依賴範圍。在項目發佈過程當中,幫助決定哪些構件被包括進來。欲知詳情請參考依賴機制。
-compile:compile是默認的範圍;若是沒有提供一個範圍,那該依賴的範圍就是編譯範
圍。編譯範圍依賴在全部的classpath中可用,同時它們也會被打包。
-provided:provided依賴只有在當JDK 或者一個容器已提供該依賴以後才使用。例如, 若是你開發了一個web 應用,你可能在編譯 classpath 中須要可用的Servlet API 來編譯一個servlet,可是你不會想要在打包好的WAR 中包含這個Servlet API;這個Servlet API JAR 由你的應用服務器或者servlet 容器提供。已提供範圍的依賴在編譯時 (不是運行時)可用。它不具備傳遞性的,也不會被打包。
-runtime:runtime依賴在運行和測試系統的時候須要,但在編譯的時候不須要。好比,你
可能在編譯的時候只須要JDBC API JAR,而只有在運行的時候才須要JDBC驅動實
現。
-test: test範圍依賴 在通常的 編譯和運行時都不須要,它們只有在測試編譯和測試運
行階段可用。
-system:system範圍依賴與provided相似,可是你必須顯式的提供一個對於本地系統中
JAR文件的路徑。這麼作是爲了容許基於本地對象編譯,而這些對象是系統類庫
的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。如
果你將一個依賴範圍設置成系統範圍,你必須同時提供一個systemPath元素。注
意該範圍是不推薦使用的(你應該一直儘可能去從公共或定製的Maven倉庫中引用
依賴)。-->
<scope>test</scope>
<!--僅供system範圍使用。注意,不鼓勵使用這個元素,而且在新的版本中該元素可能被覆蓋掉。該元素爲依賴規定了文件系統上的路徑。須要絕對路徑而不是相對路徑。推薦使用屬性匹配絕對路徑,例如${java.home}。-->
<systemPath></systemPath>
<!--默認爲false,即子項目默認都繼承,爲true,則子項目必需顯示的引入。例如:假設項目A在編譯時須要項目B的代碼,但運行時並不須要項目B,並且咱們可能並不須要全部項目都依賴項目B。-->
<optional>true</optional>
<!--當計算傳遞依賴時,從依賴構件列表裏,列出被排除的依賴構件集。即告訴maven你只依賴指定的項目,不依賴項目的依賴。也可使用通配符*排除全部依賴。此元素主要用於解決版本衝突問題.-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可選依賴,若是你在項目B中把C依賴聲明爲可選,你就須要在依賴於B的項目(例如項目A)中顯式的引用對C的依賴。可選依賴阻斷依賴的傳遞性。-->
<optional>true</optional>
</dependency>
</dependencies>
<!--繼承自該項目的全部子項目的默認依賴信息。這部分的依賴信息不會被當即解析,而是當子項目聲明一個依賴(必須描述groupID和artifactID信息),若是groupID和artifactID之外的一些信息沒有描述,則經過groupID和artifactID匹配到這裏的依賴,並使用這裏的依賴信息。-->
<dependencyManagement>
<!--參見dependencies元素-->
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<!--模塊(有時稱做子項目)被構建成項目的一部分。列出的每一個模塊元素是指向該模塊的目錄的相對路徑-->
<modules/>
<!-- Ps:繼承和模塊的區別:繼承父不知子,但子知父。模塊父知子,但子不知父。因此在具體的項目中通常都是繼承和模塊融合使用。 -->
<!--鍵值對,Properties能夠在整個POM中使用,也能夠做爲觸發條件(見settings.xml配置文件裏profiles→properties元素的說明)。格式是<name>value</name>。-->
<properties>
<dept>No</dept>
</properties>
<!--構建項目須要的信息-->
<build>
<!-- 預約義執行的目標或者階段,必須和命令行的參數相同。如:jar:jar或者clean install等等。例如:defaultGoal配置clean install ,在命令行輸入mvn時會自動拼接成mvn clean install。偷懶的福音啊。-->
<defaultGoal>install</defaultGoal>
<!-- 編譯輸出目錄,默認值${basedir}/target(不建議修改) -->
<directory>${basedir}/target</directory>
<!-- 構建產物的名稱,沒有文件擴展名。默認值${artifactId}-${version}。 -->
<finalName>${artifactId}-${version}</finalName>
<!-- 單獨過濾某個文件,更多內容請訪問如何過濾資源文件 -->
<filters>
<filter>src/main/filters/filter.properties</filter>
</filters>
<!--這個元素描述了項目相關的全部資源路徑列表,例如和項目相關的屬性文件,這些資源被包含在最終的打包文件裏。-->
<resources>
<!--這個元素描述了項目相關的資源路徑-->
<resource>
<!-- 指定build後的resource存放的文件夾。該路徑默認是basedir。一般被打包在JAR中的resources的目標路徑爲META-INF -->
<targetPath></targetPath>
<!--是否使用參數值代替參數名。如:aa=name 將my ${aa}顯示爲my name。true表明替換,false表明不替換。參數值取自properties元素、文件裏配置的屬性或者命令行的-D選項。有@aa @和${aa}倆種寫法。更多內容請查看在線幫助-->
<filtering>false</filtering>
<!--描述存放資源的目錄,該路徑相對POM路徑。默認值${basedir}/src/main/resources -->
<directory>${basedir}/src/main/resources </directory>
<!--用於指定要包括的文件。可使用通配符*。例如**/*.xml。 -->
<includes>
<include>configuration.xml</include>
</includes>
<!--用於指定不須要包括的文件。可使用通配符*。例如**/*.xml。若是和includes的配置衝突,excludes的優先級更高。 -->
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<!--該testResources元素塊包含testResource元素。它們的定義是相似的resource 元素,僅在測試階段使用。和resource元素惟一一點不一樣是testResource的默認值是${project.basedir}/src/test/resources。測試資源是不會部署。-->
<testResources>
<testResource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</testResource>
</testResources>
<plugins>
<!--plugin元素包含描述插件所須要的信息。-->
<plugin>
<!--插件在倉庫裏的groupID-->
<groupId>org.apache.maven.plugins</groupId>
<!--插件在倉庫裏的artifactID-->
<artifactId>maven-jar-plugin</artifactId>
<!--被使用的插件的版本(或版本範圍)-->
<version>2.0</version>
<!--是否從該插件下載Maven擴展(例如打包和類型處理器),因爲性能緣由,只有在真須要下載時,該元素才被設置成enabled。-->
<extensions>false</extensions>
<!-- true 或 false ,這個插件的配置是否,能夠繼承。默認true。 -->
<inherited>true</inherited>
<!-- 請查閱https://maven.apache.org/pom.html#Plugins或者查閱中文版http://blog.csdn.net/tomato__/article/details/13625497 -->
<configuration>
<classifier>test</classifier>
</configuration>
<!-- 請參考dependencies元素 -->
<dependencies>
<dependency>
<groupId/>
<artifactId/>
<version/>
<type/>
<classifier/>
<scope/>
<systemPath/>
<exclusions>
<exclusion>
<artifactId/>
<groupId/>
</exclusion>
</exclusions>
<optional/>
</dependency>
</dependencies>
<!--在構建生命週期中執行一組目標的配置。每一個目標可能有不一樣的配置。-->
<executions>
<!--execution元素包含了插件執行須要的信息-->
<execution>
<!--執行目標的標識符,用於標識構建過程當中的目標,或者匹配繼承過程當中須要合併的執行目標-->
<id>echodir</id>
<!--綁定了目標的構建生命週期階段,若是省略,目標會被綁定到源數據裏配置的默認階段-->
<phase>verify</phase>
<!--配置的執行目標-->
<goals>
<goal>run</goal>
</goals>
<!--配置是否被傳播到子POM-->
<inherited>false</inherited>
<!-- 請查閱https://maven.apache.org/pom.html#Plugins -->
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!--子項目能夠引用的默認插件信息。該插件配置項直到被引用時纔會被解析或綁定到生命週期。給定插件的任何本地配置都會覆蓋這裏的配置-->
<pluginManagement>
<plugins>
.................
</plugins>
</pluginManagement>
<!--該元素設置了項目源碼目錄,當構建項目的時候,構建系統會編譯目錄裏的源碼。該路徑是相對於pom.xml的相對路徑。-->
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<!--該元素設置了項目腳本源碼目錄,該目錄和源碼目錄不一樣:絕大多數狀況下,該目錄下的內容會被拷貝到輸出目錄(由於腳本是被解釋的,而不是被編譯的)。-->
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<!--該元素設置了項目單元測試使用的源碼目錄,當測試項目的時候,構建系統會編譯目錄裏的源碼。該路徑是相對於pom.xml的相對路徑。-->
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<!--被編譯過的應用程序class文件存放的目錄。-->
<outputDirectory>${basedir}/target/classes</outputDirectory>
<!--被編譯過的測試class文件存放的目錄。-->
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
<!--使用來自該項目的一系列構建擴展-->
<extensions>
<!--描述使用到的構建擴展。-->
<extension>
<!--構建擴展的groupId-->
<groupId/>
<!--構建擴展的artifactId-->
<artifactId/>
<!--構建擴展的版本-->
<version/>
</extension>
</extensions>
</build>
<!--該元素描述使用報表插件產生報表的規範。當用戶執行「mvn site」,這些報表就會運行。在頁面導航欄能看到全部報表的連接。-->
<reporting>
<!--全部產生的報表存放到哪裏。默認值是${basedir}/target/site
。-->
<outputDirectory>${basedir}/target/site</outputDirectory>
<!--若是爲true,則網站不包括默認的報表。這包括「項目信息」菜單中的報表。默認false-->
<excludeDefaults>false</excludeDefaults>
<!--使用的報表插件和他們的配置。-->
<plugins>
<!--plugin元素包含描述報表插件須要的信息-->
<plugin>
<!--報表插件在倉庫裏的groupID,默認值是 : org.apache.maven.plugins 。-->
<groupId>org.apache.maven.plugins</groupId>
<!--報表插件在倉庫裏的artifactID-->
<artifactId>maven-project-info-reports-plugin</artifactId>
<!--被使用的報表插件的版本(或版本範圍)-->
<version>2.7</version>
<!--任何配置是否被傳播到子項目,默認true-->
<inherited>true<inherited/>
<!--報表插件的配置-->
<configuration/>
<!--一組報表的多重規範,每一個規範可能有不一樣的配置。一個規範(報表集)對應一個執行目標。例如,有1,2,3,4,5,6,7,8,9個報表。1,2,5構成A報表集,對應一個執行目標。2,5,8構成B報表集,對應另外一個執行目標-->
<reportSets>
<!--表示報表的一個集合,以及產生該集合的配置-->
<reportSet>
<!--報表集合的惟一標識符,POM繼承時用到,默認值:default -->
<id>default<id>
<!--產生報表集合時,被使用的報表的配置-->
<configuration/>
<!--配置是否被繼承到子POMs-->
<inherited/>
<!--這個集合裏使用到哪些報表-->
<reports/>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>