pom是Project Object Model(項目對象模型)的縮寫,是Maven中的項目文件,可用於管理與配置依賴,組織信息,項目受權,遠程倉庫等等.一個Maven項目,能夠沒有任何代碼,但不能沒有pom.xml.java
<project>是pom.xml的根元素,包含了一些約束信息.web
<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"> </project>
<modelVersion>4.0.0</modelVersion>
pom的版本,這是Maven 2&3惟一支持的pom版本,並且不能忽略.spring
<groupId>,<artifactId>與<version>標識了倉庫中的一個特定位置,叫項目座標.三個屬性告訴了Maven項目中的一個特定版本,讓Maven知道如何處理它們以及在生命週期內的哪一階段須要它們.shell
<groupId>表示項目所屬的組,一般是一個公司或者組織的名稱,如org.springframework.apache
<artifactId>表示項目的惟一標識.bash
<version>表示項目的版本號,一般來講項目的版本號分紅三段: 主版本號.次版本號.修訂版本號服務器
版本號的後綴意味着項目的不一樣階段:架構
打包類型,沒有提供的話默認值爲jar,常見的有jar與war,也能夠取值:app
Maven的一個強大之處是處理項目關係的方式,能夠經過一個公共的本地倉庫去解決問題.maven
POM的基礎就是依賴列表,Maven下載與在編譯時連接依賴與其餘所須要的目標,並且能夠處理傳遞性依賴,使列表能夠專一於項目所需的依賴.依賴放在<dependencies>裏面,包含若干個<dependency>.
<dependencies> <dependency> .... </dependency> <dependency> .... </dependency> </dependencies>
一個<dependency>一般包含:
對應項目座標
版本
可用於配置不一樣jdk的<depenency>,好比讓一個<dependency>同時支持jdk8與jdk11,能夠選擇使用哪個<classifier>,方便在不一樣jdk中使用.
對應的依賴類型,默認爲jar,一般對應與<packaging>.
scope表示類庫與項目的關係,能夠取如下5個值:
當<scope>爲system才須要這個,不然(當<scope>不爲system時)會構建失敗.路徑必須爲絕對路徑.
標記依賴的可選狀態.
排除不須要的依賴,包含子元素<exclusion>,每一個<exclusion>都包含<groupId>與<artifactId>.
使用<parent>指定須要繼承的pom.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent>
子pom會繼承父pom的<groupId>,<version>,<build>等衆多屬性,具體包括:
但不能繼承:
另外,就像java中全部類都繼承於java.lang.Object同樣,全部POM都有一個"Super POM",pom都從它繼承而來,下面是Maven3.5.4的"Super pom":
<project> <modelVersion>4.0.0</modelVersion> <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories> <build> <directory>${project.basedir}/target</directory> <outputDirectory>${project.build.directory}/classes</outputDirectory> <finalName>${project.artifactId}-${project.version}</finalName> <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> </testResource> </testResources> <pluginManagement> <!-- NOTE: These plugins will be removed from future versions of the super POM --> <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) --> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.8</version> </plugin> <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> </plugin> </plugins> </pluginManagement> </build> <reporting> <outputDirectory>${project.build.directory}/site</outputDirectory> </reporting> <profiles> <!-- NOTE: The release profile will be removed from future versions of the super POM --> <profile> <id>release-profile</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <plugin> <inherited>true</inherited> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-javadoc-plugin</artifactId> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-deploy-plugin</artifactId> <configuration> <updateReleaseInfo>true</updateReleaseInfo> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project>
模塊是pom列出的項目,並做爲一個組執行,每一個模塊經過pom文件或項目的相對路徑進行列出.
<modules> <module>my-project</module> <module>another-project</module> <module>third-project/pom-example.xml</module> </modules>
不須要考慮模塊間的依賴關係,Maven會對其進行拓撲排序以便在依賴模塊以前構建依賴關係.
屬性是Maven中的值佔位符,像Ant同樣,能夠以
${x}
這樣的形式在pom.xml的任何位置訪問一個值,也能夠被用做默認值使用. 有5種形式使用值:
env會使用當前shell的環境變量的值. 例如
${env.PATH}
<project>下的x元素的值,如
${project.version}
使用settings.xml中的元素的值
${settings.offline}
java系統屬性值,經過java.lang.System.getProperties()獲取,如
${java.home}
直接使用x,用的是<properties>下的屬性,好比
<properties> <aaa>AAAAA</aaa> </properties>
${aaa}
<build>,聲明項目結構,管理插件等.
目標的默認值,能夠取值install,copile
構建產生的文件存放目錄
構建最終產生的項目名字,但有可能會被更改.
定義一組<filter>,<filter>內是.properties文件,項目中的佔位符如xxx.xxx會被.properties中的xxx=xxx的具體值替換掉.
<resources>,項目相關的資源文件的位置.
描述每一個資源的根元素.
構建資源的位置,對於jar包放在META-INF裏面.
取值true或false,表示是否開啓過濾
資源位置.
指定要包含的資源,使用*做爲通配符.
與include相反,要排除的資源列表.
<plugins>下包含了若干個<plugin>,表示插件,每一個<plugin>有如下元素:
與上面的<groupId>與<artifactId>同樣.
與上面的<version>同樣.
取值true或false,表示是否加載擴展,默認爲false.
取值ture或false,是否應用pom的繼承關係,默認true.
插件項的相關配置,能夠配置<finalName>,<appendAssemblyld>,<descriptor>等.
引入插件的依賴,與前面的<dependencies>相似.
插件可能有多個目標,<executions>配置每個<execution>做爲插件的目標,在<execution>中,用<id>指定執行目標的標識符,用<goals>指定目標,<goals>包含一組<goal>,<phase>用於指定階段,<inherited>用於指定是否啓用繼承關係.另外<execution>也能夠包含<configuration>,與上面相似,用於配置特定的目標,而不是插件的全部目標.
<pluginManagement>,包含一組<plugins>,繼承於此項目的子項目均可以使用,子項目能夠覆蓋修改<pluginManagement>.
能夠爲pom設置各類目錄,好比
<sourceDirectory></sourceDirectory>
構建項目時會編譯該目錄的源碼,是相對於pom.xml的相對路徑.
<testSourceDirectory></testSourceDirectory>
測試時會編譯其中的源碼,也是相對於pom.xml的相對路徑.
<outputDirectory></outputDirectory>
這裏存放被編譯過的class文件.
<testOutputDirectory></testOutputDirectory>
存放測試文件編譯後的class文件.
<extensions>,將包含在運行中的構建的類路徑中,在構建過程當中能夠激活擴展.好比能夠爲,例如這是支持ftp的wagon-ftp插件:
<build> <extensions> <extension> <groupId>org.apache.maven.wagon</groudId> <artifactId>wagon-ftp</artifactId> <version>3.3.4</version> </extension> </extensions> </build>
<reporting>,描述產生報表的規範等,執行"mvn site"時報表就會運行.
是否包含默認報表.
報表存放位置.
報表包含的插件以及配置.
包含一組<reportSet>,與<execution>相似,配置多個目標,每一個<reportSet>包含<id>,<configuration>,<inherited>,以及<reports>,<id>指定報表集合的標識符,<configuration>表示使用的報表配置,<inherited>表示是否繼承到子pom,<reports>包含一組<report>,表示使用哪些報表.
<licenses>,包含一組<license>,每一個<license>包含<name>,<url>,<distribution>,<comments>.
名稱.
官方license頁面的url.
項目分發的方式,能夠選擇
一些補充信息.
<organazation>,包含<name>,<url>,與<license>的相似.
<developers>,包含一組<developer>,每一個<developer>包含:
開發者id.
姓名.
郵箱.
主頁url.
所屬組織.
所屬組織的主頁url.
角色,包含一組<role>,一個<role>描述一個角色.
時區,能夠以America/New_York或Europe/Berlin這樣的形式,或者設置一個整數,範圍[-11,12].
開發者屬性,如如何處理即時消息等.
<contributors>,包含一組<contributor>,相似於<developer>,包含<name>,<email>等元素.
<issueManagement>,定義缺陷跟蹤系統,如Bugzilla,TestTrack,ClearQuest等,包含<system>與<url>元素,<system>指定系統名字,<url>指定問題管理系統的url.
<ciManagement>,使用了觸發器,包含了:
持續集成系統的名稱.
持續集成系統的url.
包含一組<notifier>,用來配置觸發器,每一個<notifier>包含:
如何發送通知,好比能夠取值mail.
取值true/false,錯誤時發送.
取值true/false,失敗時發送.
取值true/false,成功時發送.
取值true/false,發生警告時發送.
相關配置,例如能夠添加<address>,發送的地址.
<mailingLists>,包含一組<mailingList>,表示郵件信息,包括:
郵件名稱.
訂閱郵件地址或連接.
取消訂閱郵件或連接.
要發送的郵件地址.
查看舊的郵件的url.
<scm>,也叫Source Code/Control Management,容許配置代碼庫供web站點和其餘插件使用.包含:
描述如何經過Maven鏈接到版本控制系統,其中connection須要讀權限,developConnection須要寫權限.
代碼標籤,默認爲HEAD.
公開的可瀏覽的倉庫,例如ViewVC或Fisheye.
<prerequisites>,這是Maven2中的元素,只有一個子元素<maven>,指定maven的版本,且規定是2.x版本.Maven3中不須要<prerequisites>了,能夠用:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.0.0-M3</version> <executions> <execution> <id>enforce-maven</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireMavenVersion> <version>3.0</version> </requireMavenVersion> </rules> </configuration> </execution> </executions> </plugin> </plugins> </build>
代替.
<repositories>,包含一組<repository>,表示倉庫的位置,每一個<repository>包含:
如何處理遠征倉庫的發佈版本,包含:
如何處理遠程倉庫的快照版本,包含的元素與<releases>同樣.
遠程倉庫的標識符.
遠程倉庫的名稱.
遠程倉庫的url.
倉庫佈局類型,能夠是default或legacy,Maven2.x爲倉庫提供了默認佈局.
<pluginRepositories>,插件的遠程倉庫列表,包含一組<pluginRepository>,與<repositories>中的<repository>相似.
<distributeManagement>,管理整個構建過程當中的分發,能夠把網站部署到遠程服務器或者把構件部署到遠程倉庫.包含:
<repository>,倉庫信息,包含:
還有一個叫<snapshotRepository>的元素,與<repository>相似,表示快照倉庫.
<site>,定義瞭如何部署項目的站點與文檔.包含:
<relocation>,表示項目的新位置.包含:
<profiles>,包含一組<profile>,每一個<profile>能夠定義不一樣的配置,包含的元素有:
<activation>包含如下元素:
是否默認激活,true或false.
指定jdk版本.
<os>能夠定義一些特定的操做系統屬性,例如<name>,<family>,<arch>,<version>.
若Maven檢測到該屬性就會激活該屬性所在的配置文件,能夠指定<name>與<value>.
有<exists>與<missing>兩個子元素,<exists>表示若存在<exists>元素中對應的文件,則激活此配置文件.<miissing>表示若不存在<missing>元素中對應的文件,則激活此配置文件.