一、什么是pom
pom代表項(xiàng)目對象模型项戴,它是Maven中工作的基本組成單位举户。它是一個(gè)XML文件躬贡,始終保存在項(xiàng)目的基本目錄中的pom.xml文件中抵拘。pom包含的對象是使用maven來構(gòu)建的祖凫,pom.xml文件包含了項(xiàng)目的各種配置信息。 創(chuàng)建一個(gè)POM之前蜕着,應(yīng)該要先決定項(xiàng)目組(groupId)谋竖,項(xiàng)目名(artifactId)和版本(version),因?yàn)檫@些屬性在項(xiàng)目倉庫是唯一標(biāo)識的承匣。需要特別注意蓖乘,每個(gè)項(xiàng)目都只有一個(gè)pom.xml文件。
二韧骗、pom中的節(jié)點(diǎn)分布如下
<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>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<!-- 依賴配置 -->
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- 構(gòu)建配置 -->
<build>...</build>
<reporting>...</reporting>
<!-- 項(xiàng)目信息 -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 環(huán)境設(shè)置 -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
三驱敲、各節(jié)點(diǎn)解釋說明
1.基本配置信息
<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">
<!-- pom模型版本,maven2和3只能為4.0.0-->
<modelVersion>4.0.0</modelVersion>
<!-- 項(xiàng)目的組ID宽闲,用于maven定位-->
<groupId>com.company.bank</groupId>
<!-- 項(xiàng)目ID,通常是項(xiàng)目的名稱,唯一標(biāo)識符-->
<artifactId>parent</artifactId>
<!-- 項(xiàng)目的版本-->
<version>1.0</version>
<!-- 項(xiàng)目的打包方式-->
<packaging>war</packaging>
<project>
節(jié)點(diǎn) | 解釋說明 |
---|---|
modelVersion | pom模型版本握牧,maven2和3只能為4.0.0 |
groupId | 這是項(xiàng)目組的編號容诬,這在組織或項(xiàng)目中通常是獨(dú)一無二的。 例如沿腰,一家銀行集團(tuán)com.company.bank擁有所有銀行相關(guān)項(xiàng)目览徒。 |
artifactId | 這是項(xiàng)目的ID。這通常是項(xiàng)目的名稱颂龙。 例如习蓬,consumer-banking。 除了groupId之外措嵌,artifactId還定義了artifact在存儲庫中的位置躲叼。 |
version | 這是項(xiàng)目的版本。與groupId一起使用企巢,artifact在存儲庫中用于將版本彼此分離枫慷。 例如:com.company.bank:consumer-banking:1.0,com.company.bank:consumer-banking:1.1 |
packaging | 項(xiàng)目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par |
2.依賴配置
(1) dependencies
項(xiàng)目相關(guān)依賴配置或听,如果在父項(xiàng)目寫的依賴探孝,會被子項(xiàng)目引用。一般會在父項(xiàng)目中定義子項(xiàng)目中所有共用的依賴誉裆。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
(2)parent
用于確定父項(xiàng)目的坐標(biāo)位置顿颅。
<parent>
<groupId>com.learnPro</groupId>
<artifactId>SIP-parent</artifactId>
<relativePath></relativePath>
<version>0.0.1-SNAPSHOT</version>
</parent>
- groupId: 父項(xiàng)目的組Id標(biāo)識符
- artifactId:父項(xiàng)目的唯一標(biāo)識符
- relativePath:Maven首先在當(dāng)前項(xiàng)目中找父項(xiàng)目的pom,然后在文件系統(tǒng)的這個(gè)位置(relativePath)足丢,然后在本地倉庫粱腻,再在遠(yuǎn)程倉庫找。
- version: 父項(xiàng)目的版本
(3) modules
有些maven項(xiàng)目會做成多模塊的霎桅,這個(gè)標(biāo)簽用于指定當(dāng)前項(xiàng)目所包含的所有模塊栖疑。之后對這個(gè)項(xiàng)目進(jìn)行的maven操作,會讓所有子模塊也進(jìn)行相同操作滔驶。
<modules>
<module>com-a</>
<module>com-b</>
<module>com-c</>
<modules/>
(4) properties
用于定義pom常量
<properties>
<java.version>1.7</java.version>
</properties>
上面這個(gè)常量可以在pom文件的任意地方通過${Java.version}來引用
(5)dependencyManagement
配置寫法同dependencies
<dependencyManagement>
<dependencies>
.....
</dependencies>
</dependencyManagement>
在父模塊中定義后遇革,子模塊不會直接使用對應(yīng)依賴,但是在使用相同依賴的時(shí)候可以不加版本號,這樣的好處是揭糕,父項(xiàng)目統(tǒng)一了版本萝快,而且子項(xiàng)目可以在需要的時(shí)候才引用對應(yīng)的依賴。
父項(xiàng)目:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子項(xiàng)目:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
3.構(gòu)建配置
<build>
<!--該元素設(shè)置了項(xiàng)目源碼目錄著角,當(dāng)構(gòu)建項(xiàng)目的時(shí)候揪漩,構(gòu)建系統(tǒng)會編譯目錄里的源碼。該路徑是相對于pom.xml的相對路徑吏口。-->
<sourceDirectory/>
<!--該元素設(shè)置了項(xiàng)目腳本源碼目錄奄容,該目錄和源碼目錄不同:絕大多數(shù)情況下,該目錄下的內(nèi)容 會被拷貝到輸出目錄(因?yàn)槟_本是被解釋的产徊,而不是被編譯的)昂勒。-->
<scriptSourceDirectory/>
<!--該元素設(shè)置了項(xiàng)目單元測試使用的源碼目錄,當(dāng)測試項(xiàng)目的時(shí)候舟铜,構(gòu)建系統(tǒng)會編譯目錄里的源碼戈盈。該路徑是相對于pom.xml的相對路徑。-->
<testSourceDirectory/>
<!--被編譯過的應(yīng)用程序class文件存放的目錄谆刨。-->
<outputDirectory/>
<!--被編譯過的測試class文件存放的目錄塘娶。-->
<testOutputDirectory/>
<!--使用來自該項(xiàng)目的一系列構(gòu)建擴(kuò)展-->
<extensions>
<!--描述使用到的構(gòu)建擴(kuò)展。-->
<extension>
<!--構(gòu)建擴(kuò)展的groupId-->
<groupId/>
<!--構(gòu)建擴(kuò)展的artifactId-->
<artifactId/>
<!--構(gòu)建擴(kuò)展的版本-->
<version/>
</extension>
</extensions>
<!--當(dāng)項(xiàng)目沒有規(guī)定目標(biāo)(Maven2 叫做階段)時(shí)的默認(rèn)值-->
<defaultGoal/>
<!--這個(gè)元素描述了項(xiàng)目相關(guān)的所有資源路徑列表痊夭,例如和項(xiàng)目相關(guān)的屬性文件刁岸,這些資源被包含在最終的打包文件里。-->
<resources>
<!--這個(gè)元素描述了項(xiàng)目相關(guān)或測試相關(guān)的所有資源路徑-->
<resource>
<!-- 描述了資源的目標(biāo)路徑她我。該路徑相對target/classes目錄(例如${project.build.outputDirectory})难捌。舉個(gè)例 子膝宁,如果你想資源在特定的包里(org.apache.maven.messages),你就必須該元素設(shè)置為org/apache/maven /messages根吁。然而员淫,如果你只是想把資源放到源碼目錄結(jié)構(gòu)里,就不需要該配置击敌。-->
<targetPath/>
<!--是否使用參數(shù)值代替參數(shù)名介返。參數(shù)值取自properties元素或者文件里配置的屬性,文件在filters元素里列出沃斤。-->
<filtering/>
<!--描述存放資源的目錄圣蝎,該路徑相對POM路徑-->
<directory/>
<!--包含的模式列表,例如**/*.xml.-->
<includes/>
<!--排除的模式列表衡瓶,例如**/*.xml-->
<excludes/>
</resource>
</resources>
<!--這個(gè)元素描述了單元測試相關(guān)的所有資源路徑徘公,例如和單元測試相關(guān)的屬性文件。-->
<testResources>
<!--這個(gè)元素描述了測試相關(guān)的所有資源路徑哮针,參見build/resources/resource元素的說明-->
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</testResource>
</testResources>
<!--構(gòu)建產(chǎn)生的所有文件存放的目錄-->
<directory/>
<!--產(chǎn)生的構(gòu)件的文件名关面,默認(rèn)值是${artifactId}-${version}。-->
<finalName/>
<!--當(dāng)filtering開關(guān)打開時(shí)十厢,使用到的過濾器屬性文件列表-->
<filters/>
<!--子項(xiàng)目可以引用的默認(rèn)插件信息等太。該插件配置項(xiàng)直到被引用時(shí)才會被解析或綁定到生命周期。給定插件的任何本地配置都會覆蓋這里的配置-->
<pluginManagement>
<!--使用的插件列表 蛮放。-->
<plugins>
<!--plugin元素包含描述插件所需要的信息缩抡。-->
<plugin>
<!--插件在倉庫里的group ID-->
<groupId/>
<!--插件在倉庫里的artifact ID-->
<artifactId/>
<!--被使用的插件的版本(或版本范圍)-->
<version/>
<!--是否從該插件下載Maven擴(kuò)展(例如打包和類型處理器),由于性能原因包颁,只有在真需要下載時(shí)瞻想,該元素才被設(shè)置成enabled。-->
<extensions/>
<!--在構(gòu)建生命周期中執(zhí)行一組目標(biāo)的配置娩嚼。每個(gè)目標(biāo)可能有不同的配置蘑险。-->
<executions>
<!--execution元素包含了插件執(zhí)行需要的信息-->
<execution>
<!--執(zhí)行目標(biāo)的標(biāo)識符,用于標(biāo)識構(gòu)建過程中的目標(biāo)待锈,或者匹配繼承過程中需要合并的執(zhí)行目標(biāo)-->
<id/>
<!--綁定了目標(biāo)的構(gòu)建生命周期階段,如果省略嘴高,目標(biāo)會被綁定到源數(shù)據(jù)里配置的默認(rèn)階段-->
<phase/>
<!--配置的執(zhí)行目標(biāo)-->
<goals/>
<!--配置是否被傳播到子POM-->
<inherited/>
<!--作為DOM對象的配置-->
<configuration/>
</execution>
</executions>
<!--項(xiàng)目引入插件所需要的額外依賴-->
<dependencies>
<!--參見dependencies/dependency元素-->
<dependency>
......
</dependency>
</dependencies>
<!--任何配置是否被傳播到子項(xiàng)目-->
<inherited/>
<!--作為DOM對象的配置-->
<configuration/>
</plugin>
</plugins>
</pluginManagement>
<!--使用的插件列表-->
<plugins>
<!--參見build/pluginManagement/plugins/plugin元素-->
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<!--參見dependencies/dependency元素-->
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</build>
- reporting
該元素描述使用報(bào)表插件產(chǎn)生報(bào)表的規(guī)范竿音。當(dāng)用戶執(zhí)行“mvn site”,這些報(bào)表就會運(yùn)行拴驮。 在頁面導(dǎo)航欄能看到所有報(bào)表的鏈接春瞬。
<reporting>
<!--true,則套啤,網(wǎng)站不包括默認(rèn)的報(bào)表宽气。這包括“項(xiàng)目信息”菜單中的報(bào)表随常。-->
<excludeDefaults/>
<!--所有產(chǎn)生的報(bào)表存放到哪里。默認(rèn)值是${project.build.directory}/site萄涯。-->
<outputDirectory/>
<!--使用的報(bào)表插件和他們的配置绪氛。-->
<plugins>
<!--plugin元素包含描述報(bào)表插件需要的信息-->
<plugin>
<!--報(bào)表插件在倉庫里的group ID-->
<groupId/>
<!--報(bào)表插件在倉庫里的artifact ID-->
<artifactId/>
<!--被使用的報(bào)表插件的版本(或版本范圍)-->
<version/>
<!--任何配置是否被傳播到子項(xiàng)目-->
<inherited/>
<!--報(bào)表插件的配置-->
<configuration/>
<!--一組報(bào)表的多重規(guī)范,每個(gè)規(guī)范可能有不同的配置涝影。一個(gè)規(guī)范(報(bào)表集)對應(yīng)一個(gè)執(zhí)行目標(biāo) 枣察。例如,有1燃逻,2序目,3,4伯襟,5猿涨,6,7姆怪,8叛赚,9個(gè)報(bào)表。1片效,2红伦,5構(gòu)成A報(bào)表集,對應(yīng)一個(gè)執(zhí)行目標(biāo)淀衣。2昙读,5,8構(gòu)成B報(bào)表集膨桥,對應(yīng)另一個(gè)執(zhí)行目標(biāo)-->
<reportSets>
<!--表示報(bào)表的一個(gè)集合蛮浑,以及產(chǎn)生該集合的配置-->
<reportSet>
<!--報(bào)表集合的唯一標(biāo)識符,POM繼承時(shí)用到-->
<id/>
<!--產(chǎn)生報(bào)表集合時(shí)只嚣,被使用的報(bào)表的配置-->
<configuration/>
<!--配置是否被繼承到子POMs-->
<inherited/>
<!--這個(gè)集合里使用到哪些報(bào)表-->
<reports/>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
5.項(xiàng)目信息
- name:給用戶提供更為友好的項(xiàng)目名
- description:項(xiàng)目描述沮稚,maven文檔中保存
- url:主頁的URL,maven文檔中保存
- inceptionYear:項(xiàng)目創(chuàng)建年份册舞,4位數(shù)字蕴掏。當(dāng)產(chǎn)生版權(quán)信息時(shí)需要使用這個(gè)值
- licenses:該元素描述了項(xiàng)目所有License列表。 應(yīng)該只列出該項(xiàng)目的-
- license列表调鲸,不要列出依賴項(xiàng)目的 license列表盛杰。如果列出多個(gè)license,用戶可以選擇它們中的一個(gè)而不是接受所有l(wèi)icense藐石。(如下)
<license>
<!--license用于法律上的名稱-->
<name>...</name>
<!--官方的license正文頁面的URL-->
<url>....</url>
<!--項(xiàng)目分發(fā)的主要方式:repo即供,可以從Maven庫下載 manual, 用戶必須手動(dòng)下載和安裝依賴-->
<distribution>repo</distribution>
<!--關(guān)于license的補(bǔ)充信息-->
<comments>....</comments>
</license>
- organization:1.name 組織名 2.url 組織主頁url
- developers:項(xiàng)目開發(fā)人員列表(如下)
- contributors:項(xiàng)目其他貢獻(xiàn)者列表于微,同developers
<developers>
<!--某個(gè)開發(fā)者信息-->
<developer>
<!--開發(fā)者的唯一標(biāo)識符-->
<id>....</id>
<!--開發(fā)者的全名-->
<name>...</name>
<!--開發(fā)者的email-->
<email>...</email>
<!--開發(fā)者的主頁-->
<url>...<url/>
<!--開發(fā)者在項(xiàng)目中的角色-->
<roles>
<role>Java Dev</role>
<role>Web UI</role>
</roles>
<!--開發(fā)者所屬組織-->
<organization>sun</organization>
<!--開發(fā)者所屬組織的URL-->
<organizationUrl>...</organizationUrl>
<!--開發(fā)者屬性逗嫡,如即時(shí)消息如何處理等-->
<properties>
<!-- 和主標(biāo)簽中的properties一樣青自,可以隨意定義子標(biāo)簽 -->
</properties>
<!--開發(fā)者所在時(shí)區(qū), -11到12范圍內(nèi)的整數(shù)驱证。-->
<timezone>-5</timezone>
</developer>
</developers>
6.環(huán)境配置
issueManagement
目的問題管理系統(tǒng)(Bugzilla, Jira, Scarab)的名稱和URL
<issueManagement>
<system>Bugzilla</system>
<url>http://127.0.0.1/bugzilla/</url>
</issueManagement>
ciManagement
項(xiàng)目的持續(xù)集成信息
<ciManagement>
<system>continuum</system>
<url>http://127.0.0.1:8080/continuum</url>
<notifiers>
<notifier>
<type>mail</type>
<sendOnError>true</sendOnError>
<sendOnFailure>true</sendOnFailure>
<sendOnSuccess>false</sendOnSuccess>
<sendOnWarning>false</sendOnWarning>
<address>continuum@127.0.0.1</address>
<configuration></configuration>
</notifier>
</notifiers>
</ciManagement>
- system:持續(xù)集成系統(tǒng)的名字
- url:持續(xù)集成系統(tǒng)的URL
- notifiers:構(gòu)建完成時(shí)延窜,需要通知的開發(fā)者/用戶的配置項(xiàng)。包括被通知者信息和通知條件(錯(cuò)誤雷滚,失敗需曾,成功,警告)
type:通知方式
sendOnError:錯(cuò)誤時(shí)是否通知
sendOnFailure:失敗時(shí)是否通知
sendOnSuccess:成功時(shí)是否通知
sendOnWarning:警告時(shí)是否通知
address:通知發(fā)送到的地址
configuration:擴(kuò)展項(xiàng)
mailingLists
項(xiàng)目相關(guān)郵件列表信息
<mailingLists>
<mailingList>
<name>User List</name>
<subscribe>user-subscribe@127.0.0.1</subscribe>
<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
<post>user@127.0.0.1</post>
<archive>http://127.0.0.1/user/</archive>
<otherArchives>
<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
</otherArchives>
</mailingList>
.....
</mailingLists>
- subscribe, unsubscribe: 訂閱郵件(取消訂閱)的地址或鏈接祈远,如果是郵件地址呆万,創(chuàng)建文檔時(shí),mailto: 鏈接會被自動(dòng)創(chuàng)建
- archive:瀏覽郵件信息的URL
- post:接收郵件的地址
scm
許你配置你的代碼庫车份,供Maven web站點(diǎn)和其它插件使用
<scm>
<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>
<developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
<tag>HEAD</tag>
<url>http://127.0.0.1/websvn/my-project</url>
</scm>
- connection, developerConnection:這兩個(gè)表示我們?nèi)绾芜B接到maven的版本庫谋减。connection只提供讀,developerConnection將提供寫的請求
寫法如:scm:[provider]:[provider_specific]
如果連接到CVS倉庫扫沼,可以配置如下:- - scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
- tag:項(xiàng)目標(biāo)簽出爹,默認(rèn)HEAD
- url:共有倉庫路徑
prerequisites
項(xiàng)目構(gòu)建的前提
<prerequisites>
<maven>2.0.6</maven>
</prerequisites>
repositories,pluginRepositories
依賴和擴(kuò)展的遠(yuǎn)程倉庫列表,同上篇文章缎除,setting.xml配置中介紹的严就。
<repositories>
<repository>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<id>codehausSnapshots</id>
<name>Codehaus Snapshots</name>
<url>http://snapshots.maven.codehaus.org/maven2</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
...
</pluginRepositories>
- releases, snapshots:這是各種構(gòu)件的策略,release或者snapshot器罐。這兩個(gè)集合梢为,POM就可以根據(jù)獨(dú)立倉庫任意類型的依賴改變策略。如:一個(gè)人可能只激活下載snapshot用來開發(fā)轰坊。
- enable:true或者false铸董,決定倉庫是否對于各自的類型激活(release 或者 snapshot)。
- updatePolicy: 這個(gè)元素決定更新頻率肴沫。maven將比較本地pom的時(shí)間戳(存儲在倉庫的maven數(shù)據(jù)文件中)和遠(yuǎn)程的. 有以下選擇: always, daily (默認(rèn)), interval:X (x是代表分鐘的整型) 粟害, never.
- checksumPolicy:當(dāng)Maven向倉庫部署文件的時(shí)候,它也部署了相應(yīng)的校驗(yàn)和文件颤芬”可選的為:ignore,fail站蝠,warn汰具,或者不正確的校驗(yàn)和。
- layout:在上面描述倉庫的時(shí)候沉衣,提到他們有統(tǒng)一的布局郁副。Maven 2有它倉庫默認(rèn)布局减牺。然而豌习,Maven 1.x有不同布局存谎。使用這個(gè)元素來表明它是default還是legacy。