1 setting.xml
maven的配置文件setting.xml存在于兩個(gè)地方:
- 安裝的地方:${M2_HOME}/conf/settings.xml
- 用戶(hù)的目錄:${user.home}/.m2/settings.xml泵琳,該目錄可以自己定義
前者稱(chēng)為全部變量练般,對(duì)操作系統(tǒng)的所有使用者有效;后者為用戶(hù)配置,只對(duì)當(dāng)前操作系統(tǒng)的使用者有效舟误。如果兩者共存,內(nèi)容將會(huì)合并,并且用戶(hù)配置會(huì)覆蓋全局配置。
Maven安裝后顶瞒,用戶(hù)目錄下不會(huì)自動(dòng)生成settings.xml,只有全局配置文件元旬。如果需要?jiǎng)?chuàng)建用戶(hù)范圍的settings.xml榴徐,可以將安裝路徑下的settings復(fù)制到目錄${user.home}/.m2/。Maven默認(rèn)的settings.xml是一個(gè)包含了注釋和例子的模板匀归,可以快速的修改它來(lái)達(dá)到你的要求箕速。
全局配置一旦更改,所有的用戶(hù)都會(huì)受到影響朋譬,而且如果maven進(jìn)行升級(jí),所有的配置都會(huì)被清除兴垦,所以要提前復(fù)制和備份${M2_HOME}/conf/settings.xml文件徙赢,一般情況下不推薦配置全局的settings.xml。
下面的配置文件對(duì)各個(gè)節(jié)點(diǎn)的含義及作用都有注解探越。實(shí)際應(yīng)用中狡赐,經(jīng)常使用的是<localRepository>、<servers>钦幔、<mirrors>枕屉、<profiles>有限幾個(gè)節(jié)點(diǎn),其他節(jié)點(diǎn)使用默認(rèn)值足夠應(yīng)對(duì)大部分的應(yīng)用場(chǎng)景鲤氢。
關(guān)于xmlns屬性的解析可以查看文章:https://zhuanlan.zhihu.com/p/148110873
<?xml version="1.0" encoding="UTF-8"?>
<settings
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/settings-1.0.0.xsd">
<!--本地倉(cāng)庫(kù)搀擂。該值表示構(gòu)建系統(tǒng)本地倉(cāng)庫(kù)的路徑。其默認(rèn)值為${user.home}/.m2/repository卷玉。 -->
<localRepository>usr/local/maven</localRepository>
<!--Maven是否需要和用戶(hù)交互以獲得輸入哨颂。如果Maven需要和用戶(hù)交互以獲得輸入,則設(shè)置成true相种,反之則應(yīng)為false威恼。默認(rèn)為true。 -->
<interactiveMode>true</interactiveMode>
<!--Maven是否需要使用plugin-registry.xml文件來(lái)管理插件版本。
如果設(shè)置為true箫措,則在{user.home}/.m2下需要有一個(gè)plugin-registry.xml來(lái)對(duì)plugin的版本進(jìn)行管理
默認(rèn)為false腹备。 -->
<usePluginRegistry>false</usePluginRegistry>
<!--表示Maven是否需要在離線模式下運(yùn)行。如果構(gòu)建系統(tǒng)需要在離線模式下運(yùn)行斤蔓,則為true植酥,默認(rèn)為false。
當(dāng)由于網(wǎng)絡(luò)設(shè)置原因或者安全因素附迷,構(gòu)建服務(wù)器不能連接遠(yuǎn)程倉(cāng)庫(kù)的時(shí)候惧互,該配置就十分有用。 -->
<offline>false</offline>
<!--當(dāng)插件的組織Id(groupId)沒(méi)有顯式提供時(shí)喇伯,供搜尋插件組織Id(groupId)的列表喊儡。
該元素包含一個(gè)pluginGroup元素列表,每個(gè)子元素包含了一個(gè)組織Id(groupId)稻据。
當(dāng)我們使用某個(gè)插件艾猜,并且沒(méi)有在命令行為其提供組織Id(groupId)的時(shí)候,Maven就會(huì)使用該列表捻悯。
默認(rèn)情況下該列表包含了org.apache.maven.plugins匆赃。 -->
<pluginGroups>
<!--plugin的組織Id(groupId)-->
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
<!--用來(lái)配置不同的代理,多代理profiles可以應(yīng)對(duì)筆記本或移動(dòng)設(shè)備的工作環(huán)境:通過(guò)簡(jiǎn)單的設(shè)置profile id就可以很容易的更換整個(gè)代理配置 -->
<proxies>
<!--代理元素包含配置代理時(shí)需要的信息 -->
<proxy>
<!--代理的唯一定義符今缚,用來(lái)區(qū)分不同的代理元素算柳。 -->
<id>myproxy</id>
<!--該代理是否是激活的那個(gè)。true則激活代理姓言。當(dāng)我們聲明了一組代理瞬项,而某個(gè)時(shí)候只需要激活一個(gè)代理的時(shí)候,該元素就可以派上用處 -->
<active>true</active>
<!--代理的協(xié)議何荚。 協(xié)議://主機(jī)名:端口囱淋,分隔成離散的元素以方便配置。 -->
<protocol>http://…</protocol>
<!--代理的主機(jī)名餐塘。協(xié)議://主機(jī)名:端口妥衣,分隔成離散的元素以方便配置。 -->
<host>proxy.somewhere.com</host>
<!--代理的端口戒傻。協(xié)議://主機(jī)名:端口税手,分隔成離散的元素以方便配置。 -->
<port>8080</port>
<!--代理的用戶(hù)名需纳,用戶(hù)名和密碼表示代理服務(wù)器認(rèn)證的登錄名和密碼冈止。 -->
<username>proxyuser</username>
<!--代理的密碼,用戶(hù)名和密碼表示代理服務(wù)器認(rèn)證的登錄名和密碼候齿。 -->
<password>somepassword</password>
<!--不該被代理的主機(jī)名列表熙暴。該列表的分隔符由代理服務(wù)器指定闺属;例子中使用了豎線分隔符,使用逗號(hào)分隔也很常見(jiàn)周霉。 -->
<nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
</proxy>
</proxies>
<!--配置服務(wù)端的一些設(shè)置掂器。一些設(shè)置如安全證書(shū)不應(yīng)該和pom.xml一起分發(fā)。這種類(lèi)型的信息應(yīng)該存在于構(gòu)建服務(wù)器上的settings.xml文件中俱箱。 -->
<servers>
<!--服務(wù)器元素包含配置服務(wù)器時(shí)需要的信息 -->
<server>
<!--這是server的id(注意不是用戶(hù)登陸的id)国瓮,該id與distributionManagement中repository元素的id相匹配。 -->
<id>server001</id>
<!--鑒權(quán)用戶(hù)名狞谱。鑒權(quán)用戶(hù)名和鑒權(quán)密碼表示服務(wù)器認(rèn)證所需要的登錄名和密碼乃摹。 -->
<username>my_login</username>
<!--鑒權(quán)密碼 。鑒權(quán)用戶(hù)名和鑒權(quán)密碼表示服務(wù)器認(rèn)證所需要的登錄名和密碼跟衅。 -->
<password>my_password</password>
<!--鑒權(quán)時(shí)使用的私鑰位置孵睬。和前兩個(gè)元素類(lèi)似,私鑰位置和私鑰密碼指定了一個(gè)私鑰的路徑
(默認(rèn)是/home/hudson/.ssh/id_dsa)以及如果需要的話(huà)伶跷,一個(gè)密語(yǔ)掰读。
將來(lái)passphrase和password元素可能會(huì)被提取到外部,但目前它們必須在settings.xml文件以純文本的形式聲明 -->
<privateKey>${usr.home}/.ssh/id_dsa</privateKey>
<!--鑒權(quán)時(shí)使用的私鑰密碼叭莫。 -->
<passphrase>some_passphrase</passphrase>
<!--文件被創(chuàng)建時(shí)的權(quán)限蹈集。如果在部署的時(shí)候會(huì)創(chuàng)建一個(gè)倉(cāng)庫(kù)文件或者目錄,這時(shí)候就可以使用權(quán)限(permission)雇初。
這兩個(gè)元素合法的值是一個(gè)三位數(shù)字拢肆,其對(duì)應(yīng)了unix文件系統(tǒng)的權(quán)限,如664靖诗,或者775郭怪。 -->
<filePermissions>664</filePermissions>
<!--目錄被創(chuàng)建時(shí)的權(quán)限。 -->
<directoryPermissions>775</directoryPermissions>
<!--傳輸層額外的配置項(xiàng) -->
<configuration></configuration>
</server>
</servers>
<!--為倉(cāng)庫(kù)列表配置的下載鏡像列表呻畸。 -->
<mirrors>
<!--給定倉(cāng)庫(kù)的下載鏡像。 -->
<mirror>
<!--該鏡像的唯一標(biāo)識(shí)符悼院。id用來(lái)區(qū)分不同的mirror元素伤为。 -->
<id>planetmirror.com</id>
<!--鏡像名稱(chēng) -->
<name>PlanetMirror Australia</name>
<!--該鏡像的URL。構(gòu)建系統(tǒng)會(huì)優(yōu)先考慮使用該URL据途,而非使用默認(rèn)的服務(wù)器URL绞愚。 -->
<url>http://downloads.planetmirror.com/pub/maven2</url>
<!--被鏡像的服務(wù)器的id。例如颖医,如果我們要設(shè)置了一個(gè)Maven中央倉(cāng)庫(kù)(http://repo1.maven.org/maven2)的鏡像位衩,就需要將該元素設(shè)置成central。這必須和中央倉(cāng)庫(kù)的id central完全一致熔萧。 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!--根據(jù)環(huán)境參數(shù)來(lái)調(diào)整構(gòu)建配置的列表糖驴。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本僚祷。
它包含了id,activation, repositories, pluginRepositories和 properties元素贮缕。
這里的profile元素只包含這五個(gè)子元素是因?yàn)檫@里只關(guān)心構(gòu)建系統(tǒng)這個(gè)整體(這正是settings.xml文件的角色定位)辙谜,而非單獨(dú)的項(xiàng)目對(duì)象模型設(shè)置。
如果一個(gè)settings中的profile被激活感昼,它的值會(huì)覆蓋任何其它定義在POM中或者profile.xml中的帶有相同id的profile装哆。 -->
<profiles>
<!--根據(jù)環(huán)境參數(shù)來(lái)調(diào)整的構(gòu)件的配置 -->
<profile>
<!--該配置的唯一標(biāo)識(shí)符。 -->
<id>test</id>
<!--自動(dòng)觸發(fā)profile的條件邏輯定嗓。Activation是profile的開(kāi)啟鑰匙蜕琴。
如POM中的profile一樣,profile的力量來(lái)自于它能夠在某些特定的環(huán)境中自動(dòng)使用某些特定的值宵溅;這些環(huán)境通過(guò)activation元素指定凌简。
activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以包含profile的id层玲。
profile也可以通過(guò)在命令行号醉,使用-P標(biāo)記和逗號(hào)分隔的列表來(lái)顯式的激活(如,-P test)辛块。 -->
<activation>
<!--profile默認(rèn)是否激活的標(biāo)識(shí) -->
<activeByDefault>false</activeByDefault>
<!--activation有一個(gè)內(nèi)建的java版本檢測(cè)畔派,如果檢測(cè)到j(luò)dk版本與期待的一樣,profile被激活润绵。 -->
<jdk>1.7</jdk>
<!--當(dāng)匹配的操作系統(tǒng)屬性被檢測(cè)到线椰,profile被激活。os元素可以定義一些操作系統(tǒng)相關(guān)的屬性尘盼。 -->
<os>
<!--激活profile的操作系統(tǒng)的名字 -->
<name>Windows XP</name>
<!--激活profile的操作系統(tǒng)所屬家族(如 'windows') -->
<family>Windows</family>
<!--激活profile的操作系統(tǒng)體系結(jié)構(gòu) -->
<arch>x86</arch>
<!--激活profile的操作系統(tǒng)版本 -->
<version>5.1.2600</version>
</os>
<!--如果Maven檢測(cè)到某一個(gè)屬性(其值可以在POM中通過(guò)${名稱(chēng)}引用)憨愉,其擁有對(duì)應(yīng)的名稱(chēng)和值,Profile就會(huì)被激活卿捎。
如果值字段是空的配紫,那么存在屬性名稱(chēng)字段就會(huì)激活profile,否則按區(qū)分大小寫(xiě)方式匹配屬性值字段 -->
<property>
<!--激活profile的屬性的名稱(chēng) -->
<name>mavenVersion</name>
<!--激活profile的屬性的值 -->
<value>2.0.3</value>
</property>
<!--提供一個(gè)文件名午阵,通過(guò)檢測(cè)該文件的存在或不存在來(lái)激活profile躺孝。missing檢查文件是否存在,如果不存在則激活profile底桂。
另一方面植袍,exists則會(huì)檢查文件是否存在,如果存在則激活profile籽懦。 -->
<file>
<!--如果指定的文件存在于个,則激活profile。 -->
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
<!--如果指定的文件不存在暮顺,則激活profile厅篓。 -->
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
</file>
</activation>
<!--對(duì)應(yīng)profile的擴(kuò)展屬性列表秀存。Maven屬性和Ant中的屬性一樣,可以用來(lái)存放一些值贷笛。這些值可以在POM中的任何地方使用標(biāo)記${X}來(lái)使用米同,這里X是指屬性的名稱(chēng)蜕煌。
屬性有五種不同的形式爆存,并且都能在settings.xml文件中訪問(wèn)养距。
1\. env.X: 在一個(gè)變量前加上"env."的前綴,會(huì)返回一個(gè)shell環(huán)境變量汇荐。例如,"env.PATH"指代了$path環(huán)境變量(在Windows上是%PATH%)洞就。
2\. project.x:指代了POM中對(duì)應(yīng)的元素值。
3\. settings.x: 指代了settings.xml中對(duì)應(yīng)元素的值掀淘。
4\. Java System Properties: 所有可通過(guò)java.lang.System.getProperties()訪問(wèn)的屬性都能在POM中使用該形式訪問(wèn)旬蟋,
如/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre。
5\. x: 在<properties/>元素中革娄,或者外部文件中設(shè)置倾贰,以${someVar}的形式使用。 -->
<properties>
<!-- 如果這個(gè)profile被激活拦惋,那么屬性${user.install}就可以被訪問(wèn)了 -->
<user.install>usr/local/winner/jobs/maven-guide</user.install>
</properties>
<!--遠(yuǎn)程倉(cāng)庫(kù)列表匆浙,它是Maven用來(lái)填充構(gòu)建系統(tǒng)本地倉(cāng)庫(kù)所使用的一組遠(yuǎn)程項(xiàng)目。 -->
<repositories>
<!--包含需要連接到遠(yuǎn)程倉(cāng)庫(kù)的信息 -->
<repository>
<!--遠(yuǎn)程倉(cāng)庫(kù)唯一標(biāo)識(shí) -->
<id>codehausSnapshots</id>
<!--遠(yuǎn)程倉(cāng)庫(kù)名稱(chēng) -->
<name>Codehaus Snapshots</name>
<!--如何處理遠(yuǎn)程倉(cāng)庫(kù)里發(fā)布版本的下載 -->
<releases>
<!--true或者false表示該倉(cāng)庫(kù)是否為下載某種類(lèi)型構(gòu)件(發(fā)布版厕妖,快照版)開(kāi)啟首尼。 -->
<enabled>false</enabled>
<!--該元素指定更新發(fā)生的頻率。Maven會(huì)比較本地POM和遠(yuǎn)程POM的時(shí)間戳言秸。這里的選項(xiàng)是:
always(一直)软能,daily(默認(rèn),每日)举畸,interval:X(這里X是以分鐘為單位的時(shí)間間隔)查排,或者never(從不)。 -->
<updatePolicy>always</updatePolicy>
<!--當(dāng)Maven驗(yàn)證構(gòu)件校驗(yàn)文件失敗時(shí)該怎么做:
ignore(忽略)抄沮,fail(失敯虾恕),或者warn(警告)合是。 -->
<checksumPolicy>warn</checksumPolicy>
</releases>
<!--如何處理遠(yuǎn)程倉(cāng)庫(kù)里快照版本的下載了罪。有了releases和snapshots這兩組配置锭环,POM就可以在每個(gè)單獨(dú)的倉(cāng)庫(kù)中聪全,為每種類(lèi)型的構(gòu)件采取不同的策略。
例如辅辩,可能有人會(huì)決定只為開(kāi)發(fā)目的開(kāi)啟對(duì)快照版本下載的支持难礼。參見(jiàn)repositories/repository/releases元素 -->
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<!--遠(yuǎn)程倉(cāng)庫(kù)URL娃圆,按protocol://hostname/path形式 -->
<url>http://snapshots.maven.codehaus.org/maven2</url>
<!--用于定位和排序構(gòu)件的倉(cāng)庫(kù)布局類(lèi)型-可以是default(默認(rèn))或者legacy(遺留)。
Maven 2為其倉(cāng)庫(kù)提供了一個(gè)默認(rèn)的布局蛾茉;然而讼呢,Maven 1.x有一種不同的布局。我們可以使用該元素指定布局是default(默認(rèn))還是legacy(遺留)谦炬。 -->
<layout>default</layout>
</repository>
</repositories>
<!--發(fā)現(xiàn)插件的遠(yuǎn)程倉(cāng)庫(kù)列表悦屏。倉(cāng)庫(kù)是兩種主要構(gòu)件的家。第一種構(gòu)件被用作其它構(gòu)件的依賴(lài)键思。這是中央倉(cāng)庫(kù)中存儲(chǔ)的大部分構(gòu)件類(lèi)型础爬。另外一種構(gòu)件類(lèi)型是插件。
Maven插件是一種特殊類(lèi)型的構(gòu)件吼鳞。由于這個(gè)原因看蚜,插件倉(cāng)庫(kù)獨(dú)立于其它倉(cāng)庫(kù)。pluginRepositories元素的結(jié)構(gòu)和repositories元素的結(jié)構(gòu)類(lèi)似赔桌。
每個(gè)pluginRepository元素指定一個(gè)Maven可以用來(lái)尋找新插件的遠(yuǎn)程地址供炎。 -->
<pluginRepositories>
<!--包含需要連接到遠(yuǎn)程插件倉(cāng)庫(kù)的信息.參見(jiàn)profiles/profile/repositories/repository元素的說(shuō)明 -->
<pluginRepository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
</releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<id />
<name />
<url />
<layout />
</pluginRepository>
</pluginRepositories>
<!--手動(dòng)激活profiles的列表,按照profile被應(yīng)用的順序定義activeProfile疾党。 該元素包含了一組activeProfile元素音诫,每個(gè)activeProfile都含有一個(gè)profile id。
任何在activeProfile中定義的profile id仿贬,不論環(huán)境設(shè)置如何纽竣,其對(duì)應(yīng)的 profile都會(huì)被激活。
如果沒(méi)有匹配的profile茧泪,則什么都不會(huì)發(fā)生蜓氨。例如,env-test是一個(gè)activeProfile队伟,則在pom.xml(或者profile.xml)中對(duì)應(yīng)id的profile會(huì)被激活穴吹。
如果運(yùn)行過(guò)程中找不到這樣一個(gè)profile,Maven則會(huì)像往常一樣運(yùn)行嗜侮。 -->
<activeProfiles>
<activeProfile>env-test</activeProfile>
</activeProfiles>
</profile>
</profiles>
</settings>
2.pom.xml
settings.xml文件主要用于配置maven運(yùn)行環(huán)境等一系列通用屬性港令,是全局級(jí)別的配置文件,pom.xml文件描述了項(xiàng)目的maven坐標(biāo)锈颗、依賴(lài)關(guān)系等顷霹,開(kāi)發(fā)者需要遵循的規(guī)則,缺陷管理系統(tǒng)击吱,組織和licenses淋淀,以及其他所有的項(xiàng)目相關(guān)因素,是項(xiàng)目級(jí)別的配置文件覆醇。
2.1 基礎(chǔ)配置
一個(gè)典型的pom.xml文件配置為:
<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">
<!-- 模型版本朵纷。maven2.0必須是這樣寫(xiě)炭臭,現(xiàn)在是maven2唯一支持的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者組織的唯一標(biāo)志,并且配置時(shí)生成的路徑也是由此生成袍辞,
如com.winner.trade鞋仍,maven會(huì)將該項(xiàng)目打成的jar包放本地路徑:/com/winner/trade -->
<groupId>com.winner.trade</groupId>
<!-- 本項(xiàng)目的唯一ID,一個(gè)groupId下面可能多個(gè)項(xiàng)目搅吁,就是靠artifactId來(lái)區(qū)分的 -->
<artifactId>trade-core</artifactId>
<!-- 本項(xiàng)目目前所處的版本號(hào) -->
<version>1.0.0-SNAPSHOT</version>
<!-- 打包的機(jī)制威创,如pom, jar, maven-plugin, ejb, war, ear, rar, par,默認(rèn)為jar -->
<packaging>jar</packaging>
<!-- 幫助定義構(gòu)件輸出的一些附屬構(gòu)件,附屬構(gòu)件與主構(gòu)件對(duì)應(yīng)谎懦,有時(shí)候需要加上classifier才能唯一的確定該構(gòu)件
不能直接定義項(xiàng)目的classifer,因?yàn)楦綄贅?gòu)件不是項(xiàng)目直接默認(rèn)生成的那婉,而是由附加的插件幫助生成的 -->
<classifier>...</classifier>
<!-- 定義本項(xiàng)目的依賴(lài)關(guān)系 -->
<dependencies>
<!-- 每個(gè)dependency都對(duì)應(yīng)這一個(gè)jar包 -->
<dependency>
<!-- 一般情況下,maven是通過(guò)groupId党瓮、artifactId详炬、version這三個(gè)元素值(俗稱(chēng)坐標(biāo))來(lái)檢索該構(gòu)件,
然后引入你的工程寞奸。如果別人想引用你現(xiàn)在開(kāi)發(fā)的這個(gè)項(xiàng)目(前提是已開(kāi)發(fā)完畢并發(fā)布到了遠(yuǎn)程倉(cāng)庫(kù))呛谜,
就需要在他的pom文件中新建一個(gè)dependency節(jié)點(diǎn),將本項(xiàng)目的groupId枪萄、artifactId隐岛、version寫(xiě)入,
maven就會(huì)把你上傳的jar包下載到他的本地 -->
<groupId>com.winner.trade</groupId>
<artifactId>trade-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- maven認(rèn)為瓷翻,程序?qū)ν獠康囊蕾?lài)會(huì)隨著程序的所處階段和應(yīng)用場(chǎng)景而變化聚凹,所以maven中的依賴(lài)關(guān)系有作用域(scope)的限制。
scope包含如下的取值:compile(編譯范圍)齐帚、provided(已提供范圍)妒牙、runtime(運(yùn)行時(shí)范圍)、test(測(cè)試范圍)对妄、system(系統(tǒng)范圍) -->
<scope>test</scope>
<!-- 設(shè)置指依賴(lài)是否可選湘今,默認(rèn)為false,即子項(xiàng)目默認(rèn)都繼承:為true,則子項(xiàng)目必需顯示的引入,與dependencyManagement里定義的依賴(lài)類(lèi)似 剪菱。 -->
<optional>false</optional>
<!-- 屏蔽依賴(lài)關(guān)系摩瞎。
比如項(xiàng)目中使用的libA依賴(lài)某個(gè)庫(kù)的1.0版,libB依賴(lài)某個(gè)庫(kù)的2.0版孝常,現(xiàn)在想統(tǒng)一使用2.0版旗们,就應(yīng)該屏蔽掉對(duì)1.0版的依賴(lài) -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 為pom定義一些常量,在pom中的其它地方可以直接引用
使用方式 如下 :${file.encoding} -->
<properties>
<file.encoding>UTF-8</file.encoding>
<java.source.version>1.5</java.source.version>
<java.target.version>1.5</java.target.version>
</properties>
...
</project>
上面的配置定義了項(xiàng)目的基本屬性构灸。
2.1.1 dependencies
dependencies屬性是項(xiàng)目相關(guān)依賴(lài)的配置上渴,如果在父項(xiàng)目寫(xiě)的依賴(lài),會(huì)被子項(xiàng)目引用。一般會(huì)在父項(xiàng)目中定義子項(xiàng)目中所有的共用的依賴(lài)驰贷。
2.1.2 parent
parent屬性用于確認(rèn)父項(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)識(shí)符 artifactId:父項(xiàng)目的唯一標(biāo)識(shí)符 relativePath:Maven首先在當(dāng)前項(xiàng)目中找父項(xiàng)目的pom洛巢,然后在文件系統(tǒng)的這個(gè)位置(relativePath)括袒,然后在本地倉(cāng)庫(kù),再在遠(yuǎn)程倉(cāng)庫(kù)找稿茉。 version: 父項(xiàng)目的版本
2.1.3 modules
有些maven項(xiàng)目會(huì)作為多模塊锹锰,如SpringMVC項(xiàng)目就分為dal/service/controller三個(gè)模塊,這個(gè)標(biāo)簽就是用于指定當(dāng)前項(xiàng)目所包含的所有模塊漓库。之后對(duì)這個(gè)項(xiàng)目進(jìn)行的maven操作就是對(duì)所有子模塊進(jìn)行相同操作恃慧。
<modules>
<module>com-dal</>
<module>com-service</>
<module>com-controller</>
<modules/>
2.1.4 properties
properties屬性用于定于pom常亮,如一些依賴(lài)的版本號(hào)等渺蒿。
<properties>
<java.version>1.7</java.version>
</properties>
此時(shí)可以在pom文件任意地方使用${Java.version}進(jìn)行引用指定版本號(hào)痢士。
2.1.5 dependencyManagement
在父模塊中定義后,子模塊不會(huì)直接使用對(duì)應(yīng)依賴(lài)茂装,但是在使用相同依賴(lài)的時(shí)候可以不加版本號(hào),這樣的好處是怠蹂,父項(xiàng)目統(tǒng)一了版本,而且子項(xiàng)目可以在需要的時(shí)候才引用對(duì)應(yīng)的依賴(lài)少态。
父項(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>
2.1.6 classifier
classifier元素用來(lái)幫助定義構(gòu)建輸出的一些附屬構(gòu)件城侧。附屬構(gòu)件與主構(gòu)件對(duì)應(yīng),比如主構(gòu)件是 kimi-app-2.0.0.jar彼妻,該項(xiàng)目可能還會(huì)通過(guò)使用一些插件生成 如 kimi-app-2.0.0-javadoc.jar (Java文檔)嫌佑、 kimi-app-2.0.0-sources.jar(Java源代碼) 這樣兩個(gè)附屬構(gòu)件。這時(shí)候侨歉,javadoc屋摇、sources就是這兩個(gè)附屬構(gòu)件的classifier,這樣附屬構(gòu)件也就擁有了自己唯一的坐標(biāo)幽邓。
classifier的用途在于:
- maven download javadoc / sources jar包的時(shí)候摊册,需要借助classifier指明要下載那個(gè)附屬構(gòu)件
- 引入依賴(lài)的時(shí)候,有時(shí)候僅憑groupId颊艳、artifactId茅特、version無(wú)法唯一的確定某個(gè)構(gòu)件,需要借助classifier來(lái)進(jìn)一步明確目標(biāo)棋枕。比如JSON-lib白修,有時(shí)候會(huì)同一個(gè)版本會(huì)提供多個(gè)jar包,此時(shí)可以用于指定java版本重斑。
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
2.2 構(gòu)建配置
<build>
<!-- 產(chǎn)生的構(gòu)件的文件名兵睛,默認(rèn)值是${artifactId}-${version}。 -->
<finalName>myPorjectName</finalName>
<!-- 構(gòu)建產(chǎn)生的所有文件存放的目錄,默認(rèn)為${basedir}/target,即項(xiàng)目根目錄下的target -->
<directory>${basedir}/target</directory>
<!-- 當(dāng)項(xiàng)目沒(méi)有規(guī)定目標(biāo)(Maven2 叫做階段(phase))時(shí)的默認(rèn)值祖很,
必須跟命令行上的參數(shù)相同例如jar:jar笛丙,或者與某個(gè)階段(phase)相同例如install、compile等 -->
<defaultGoal>install</defaultGoal>
<!-- 當(dāng)filtering開(kāi)關(guān)打開(kāi)時(shí)假颇,使用到的過(guò)濾器屬性文件列表胚鸯。
項(xiàng)目配置信息中諸如${spring.version}之類(lèi)的占位符會(huì)被屬性文件中的實(shí)際值替換掉 -->
<filters>
<filter>../filter.properties</filter>
</filters>
<!-- 項(xiàng)目相關(guān)的所有資源路徑列表,例如和項(xiàng)目相關(guān)的配置文件笨鸡、屬性文件姜钳,這些資源被包含在最終的打包文件里。 -->
<resources>
<resource>
<!-- 描述了資源的目標(biāo)路徑形耗。該路徑相對(duì)target/classes目錄(例如${project.build.outputDirectory})哥桥。
舉個(gè)例子,如果你想資源在特定的包里(org.apache.maven.messages)激涤,你就必須該元素設(shè)置為org/apache/maven/messages拟糕。
然而,如果你只是想把資源放到源碼目錄結(jié)構(gòu)里倦踢,就不需要該配置已卸。 -->
<targetPath>resources</targetPath>
<!-- 是否使用參數(shù)值代替參數(shù)名。參數(shù)值取自properties元素或者文件里配置的屬性硼一,文件在filters元素里列出累澡。 -->
<filtering>true</filtering>
<!-- 描述存放資源的目錄,該路徑相對(duì)POM路徑 -->
<directory>src/main/resources</directory>
<!-- 包含的模式列表 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- 排除的模式列表
如果<include>與<exclude>劃定的范圍存在沖突般贼,以<exclude>為準(zhǔn) -->
<excludes>
<exclude>jdbc.properties</exclude>
</excludes>
</resource>
</resources>
<!-- 單元測(cè)試相關(guān)的所有資源路徑愧哟,配制方法與resources類(lèi)似-->
<testResources>
<testResource>
<targetPath /><filtering /><directory /><includes /><excludes />
</testResource>
</testResources>
<!-- 項(xiàng)目源碼目錄,當(dāng)構(gòu)建項(xiàng)目的時(shí)候哼蛆,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼蕊梧。該路徑是相對(duì)于pom.xml的相對(duì)路徑。 -->
<sourceDirectory>${basedir}\src\main\java</sourceDirectory>
<!-- 項(xiàng)目腳本源碼目錄腮介,該目錄和源碼目錄不同肥矢,
絕大多數(shù)情況下,該目錄下的內(nèi)容會(huì)被拷貝到輸出目錄(因?yàn)槟_本是被解釋的叠洗,而不是被編譯的)甘改。 -->
<scriptSourceDirectory>${basedir}\src\main\scripts</scriptSourceDirectory>
<!-- 項(xiàng)目單元測(cè)試使用的源碼目錄,當(dāng)測(cè)試項(xiàng)目的時(shí)候灭抑,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼十艾。該路徑是相對(duì)于pom.xml的相對(duì)路徑。 -->
<testSourceDirectory>${basedir}\src\test\java</testSourceDirectory>
<!-- 被編譯過(guò)的應(yīng)用程序class文件存放的目錄腾节。 -->
<outputDirectory>${basedir}\target\classes</outputDirectory>
<!-- 被編譯過(guò)的測(cè)試class文件存放的目錄忘嫉。 -->
<testOutputDirectory>${basedir}\target\test-classes</testOutputDirectory>
<!-- 項(xiàng)目的一系列構(gòu)建擴(kuò)展,它們是一系列build過(guò)程中要使用的產(chǎn)品荤牍,會(huì)包含在running bulid‘s classpath里面。
他們可以開(kāi)啟extensions庆冕,也可以通過(guò)提供條件來(lái)激活plugins康吵。
簡(jiǎn)單來(lái)講,extensions是在build過(guò)程被激活的產(chǎn)品-->
<extensions>
<!-- 例如访递,通常情況下晦嵌,程序開(kāi)發(fā)完成后部署到線上Linux服務(wù)器,可能需要經(jīng)歷打包力九、
將包文件傳到服務(wù)器、SSH連上服務(wù)器邑闺、敲命令啟動(dòng)程序等一系列繁瑣的步驟跌前。
實(shí)際上這些步驟都可以通過(guò)Maven的一個(gè)插件 wagon-maven-plugin 來(lái)自動(dòng)完成
下面的擴(kuò)展插件wagon-ssh用于通過(guò)SSH的方式連接遠(yuǎn)程服務(wù)器,
類(lèi)似的還有支持ftp方式的wagon-ftp插件 -->
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<!-- 使用的插件列表 陡舅。 -->
<plugins>
<plugin>
<groupId></groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<!-- 在構(gòu)建生命周期中執(zhí)行一組目標(biāo)的配置抵乓。每個(gè)目標(biāo)可能有不同的配置。 -->
<executions>
<execution>
<!-- 執(zhí)行目標(biāo)的標(biāo)識(shí)符靶衍,用于標(biāo)識(shí)構(gòu)建過(guò)程中的目標(biāo)灾炭,或者匹配繼承過(guò)程中需要合并的執(zhí)行目標(biāo) -->
<id>assembly</id>
<!-- 綁定了目標(biāo)的構(gòu)建生命周期階段,如果省略颅眶,目標(biāo)會(huì)被綁定到源數(shù)據(jù)里配置的默認(rèn)階段 -->
<phase>package</phase>
<!-- 配置的執(zhí)行目標(biāo) -->
<goals>
<goal>single</goal>
</goals>
<!-- 配置是否被傳播到子POM -->
<inherited>false</inherited>
</execution>
</executions>
<!-- 作為DOM對(duì)象的配置,配置項(xiàng)因插件而異 -->
<configuration>
<finalName>${finalName}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptor>assembly.xml</descriptor>
</configuration>
<!-- 是否從該插件下載Maven擴(kuò)展(例如打包和類(lèi)型處理器)蜈出,
由于性能原因,只有在真需要下載時(shí)涛酗,該元素才被設(shè)置成true铡原。 -->
<extensions>false</extensions>
<!-- 項(xiàng)目引入插件所需要的額外依賴(lài) -->
<dependencies>
<dependency>...</dependency>
</dependencies>
<!-- 任何配置是否被傳播到子項(xiàng)目 -->
<inherited>true</inherited>
</plugin>
</plugins>
<!-- 主要定義插件的共同元素、擴(kuò)展元素集合商叹,類(lèi)似于dependencyManagement燕刻,
所有繼承于此項(xiàng)目的子項(xiàng)目都能使用。該插件配置項(xiàng)直到被引用時(shí)才會(huì)被解析或綁定到生命周期剖笙。
給定插件的任何本地配置都會(huì)覆蓋這里的配置 -->
<pluginManagement>
<plugins>...</plugins>
</pluginManagement>
</build>
pom里面的倉(cāng)庫(kù)與settings.xml倉(cāng)庫(kù)功能一致卵洗,主要區(qū)別在于:pom倉(cāng)庫(kù)是個(gè)性化,比如說(shuō)大公司的setting文件是公用的弥咪,所有項(xiàng)目全部使用同一個(gè)settings文件过蹂,但是各自項(xiàng)目卻會(huì)引用不同的第三方庫(kù),所以就需要在pom設(shè)置自己需要的倉(cāng)庫(kù)地址聚至。
2.3 分發(fā)配置
<!-- 項(xiàng)目分發(fā)信息榴啸,在執(zhí)行mvn deploy后表示要發(fā)布的位置。
有了這些信息就可以把網(wǎng)站部署到遠(yuǎn)程服務(wù)器或者把構(gòu)件部署到遠(yuǎn)程倉(cāng)庫(kù)晚岭。 -->
<distributionManagement>
<!-- 部署項(xiàng)目產(chǎn)生的構(gòu)件到遠(yuǎn)程倉(cāng)庫(kù)需要的信息 -->
<repository>
<!-- 是分配給快照一個(gè)唯一的版本號(hào)(由時(shí)間戳和構(gòu)建流水號(hào))鸥印,還是每次都使用相同的版本號(hào)
參見(jiàn)repositories/repository元素 -->
<uniqueVersion>true</uniqueVersion>
<id> repo-id </id>
<name> repo-name </name>
<url> file://${basedir}/target/deploy </url>
<layout />
</repository>
<!-- 構(gòu)件的快照部署到哪里,如果沒(méi)有配置該元素勋功,默認(rèn)部署到repository元素配置的倉(cāng)庫(kù) -->
<snapshotRepository>
<uniqueVersion />
<id />
<name />
<url />
<layout />
</snapshotRepository>
<!-- 部署項(xiàng)目的網(wǎng)站需要的信息 -->
<site>
<!-- 部署位置的唯一標(biāo)識(shí)符,用來(lái)匹配站點(diǎn)和settings.xml文件里的配置 -->
<id> site-id </id>
<!-- 部署位置的名稱(chēng) -->
<name> site-name </name>
<!-- 部署位置的URL库说,按protocol://hostname/path形式 -->
<url> scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url>
</site>
<!-- 項(xiàng)目下載頁(yè)面的URL狂鞋。如果沒(méi)有該元素,用戶(hù)應(yīng)該參考主頁(yè)潜的。
使用該元素的原因是:幫助定位那些不在倉(cāng)庫(kù)里的構(gòu)件(由于license限制)骚揍。 -->
<downloadUrl />
<!-- 如果構(gòu)件有了新的group ID和artifact ID(構(gòu)件移到了新的位置),這里列出構(gòu)件的重定位信息啰挪。 -->
<relocation>
<!-- 構(gòu)件新的group ID -->
<groupId />
<!-- 構(gòu)件新的artifact ID -->
<artifactId />
<!-- 構(gòu)件新的版本號(hào) -->
<version />
<!-- 顯示給用戶(hù)的信不,關(guān)于移動(dòng)的額外信息,例如原因亡呵。 -->
<message />
</relocation>
<!-- 給出該構(gòu)件在遠(yuǎn)程倉(cāng)庫(kù)的狀態(tài)抽活。不得在本地項(xiàng)目中設(shè)置該元素,因?yàn)檫@是工具自動(dòng)更新的锰什。有效的值有:none(默認(rèn))下硕,converted(倉(cāng)庫(kù)管理員從Maven 1 POM轉(zhuǎn)換過(guò)來(lái)),partner(直接從伙伴Maven 2倉(cāng)庫(kù)同步過(guò)來(lái))汁胆,deployed(從Maven 2實(shí)例部署)梭姓,verified(被核實(shí)時(shí)正確的和最終的)。 -->
<status />
</distributionManagement>
2.4 倉(cāng)庫(kù)配置
<!-- 發(fā)現(xiàn)依賴(lài)和擴(kuò)展的遠(yuǎn)程倉(cāng)庫(kù)列表嫩码。 -->
<repositories>
<!-- 包含需要連接到遠(yuǎn)程倉(cāng)庫(kù)的信息 -->
<repository>
<!-- 如何處理遠(yuǎn)程倉(cāng)庫(kù)里發(fā)布版本的下載 -->
<releases>
<!-- true或者false表示該倉(cāng)庫(kù)是否為下載某種類(lèi)型構(gòu)件(發(fā)布版羔味,快照版)開(kāi)啟鱼蝉。 -->
<enabled />
<!-- 該元素指定更新發(fā)生的頻率。Maven會(huì)比較本地POM和遠(yuǎn)程POM的時(shí)間戳。
這里的選項(xiàng)是:always(一直)褥芒,daily(默認(rèn)侦锯,每日)镀娶,
interval:X(這里X是以分鐘為單位的時(shí)間間隔)缨历,或者never(從不)。 -->
<updatePolicy />
<!-- 當(dāng)Maven驗(yàn)證構(gòu)件校驗(yàn)文件失敗時(shí)該怎么做:
ignore(忽略)千劈,fail(失敿栏铡),或者warn(警告)墙牌。 -->
<checksumPolicy />
</releases>
<!-- 如何處理遠(yuǎn)程倉(cāng)庫(kù)里快照版本的下載涡驮。有了releases和snapshots這兩組配置,
POM就可以在每個(gè)單獨(dú)的倉(cāng)庫(kù)中喜滨,為每種類(lèi)型的構(gòu)件采取不同的策略捉捅。
例如,可能有人會(huì)決定只為開(kāi)發(fā)目的開(kāi)啟對(duì)快照版本下載的支持 -->
<snapshots>
<enabled /><updatePolicy /><checksumPolicy />
</snapshots>
<!-- 遠(yuǎn)程倉(cāng)庫(kù)唯一標(biāo)識(shí)符虽风“艨冢可以用來(lái)匹配在settings.xml文件里配置的遠(yuǎn)程倉(cāng)庫(kù) -->
<id> repo-id </id>
<!-- 遠(yuǎn)程倉(cāng)庫(kù)名稱(chēng) -->
<name> repo-name </name>
<!-- 遠(yuǎn)程倉(cāng)庫(kù)URL寄月,按protocol://hostname/path形式 -->
<url> http://192.168.1.169:9999/repository/ </url>
<!-- 用于定位和排序構(gòu)件的倉(cāng)庫(kù)布局類(lèi)型-可以是default(默認(rèn))或者legacy(遺留)。
Maven 2為其倉(cāng)庫(kù)提供了一個(gè)默認(rèn)的布局无牵;
然而漾肮,Maven 1.x有一種不同的布局。
我們可以使用該元素指定布局是default(默認(rèn))還是legacy(遺留)茎毁。 -->
<layout> default </layout>
</repository>
</repositories>
<!-- 發(fā)現(xiàn)插件的遠(yuǎn)程倉(cāng)庫(kù)列表克懊,這些插件用于構(gòu)建和報(bào)表 -->
<pluginRepositories>
<!-- 包含需要連接到遠(yuǎn)程插件倉(cāng)庫(kù)的信息.參見(jiàn)repositories/repository元素 -->
<pluginRepository />
</pluginRepositories>
2.5 報(bào)表配置
reporting元素描述使用報(bào)表插件產(chǎn)生報(bào)表的規(guī)范。當(dāng)用戶(hù)執(zhí)行“mvn site”七蜘,這些報(bào)表就會(huì)運(yùn)行谭溉。 在頁(yè)面導(dǎo)航欄能看到所有報(bào)表的鏈接。
<!-- 描述使用報(bào)表插件產(chǎn)生報(bào)表的規(guī)范,特定的maven 插件能輸出相應(yīng)的定制和配置報(bào)表.
當(dāng)用戶(hù)執(zhí)行“mvn site”橡卤,這些報(bào)表就會(huì)運(yùn)行,在頁(yè)面導(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>
<groupId />
<artifactId />
<version />
<inherited />
<configuration>
<links>
<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
</links>
</configuration>
<!-- 一組報(bào)表的多重規(guī)范踢关,每個(gè)規(guī)范可能有不同的配置伞鲫。
一個(gè)規(guī)范(報(bào)表集)對(duì)應(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)表集擦酌,對(duì)應(yīng)一個(gè)執(zhí)行目標(biāo)俱诸。2,5赊舶,8構(gòu)成B報(bào)表集睁搭,對(duì)應(yīng)另一個(gè)執(zhí)行目標(biāo) -->
<reportSets>
<!-- 表示報(bào)表的一個(gè)集合赶诊,以及產(chǎn)生該集合的配置 -->
<reportSet>
<!-- 報(bào)表集合的唯一標(biāo)識(shí)符,POM繼承時(shí)用到 -->
<id>sunlink</id>
<!-- 產(chǎn)生報(bào)表集合時(shí)介袜,被使用的報(bào)表的配置 -->
<configuration />
<!-- 配置是否被繼承到子POMs -->
<inherited />
<!-- 這個(gè)集合里使用到哪些報(bào)表 -->
<reports>
<report>javadoc</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
2.6 項(xiàng)目配置
<!-- 項(xiàng)目的問(wèn)題管理系統(tǒng)(Bugzilla, Jira, Scarab,或任何你喜歡的問(wèn)題管理系統(tǒng))的名稱(chēng)和URL甫何,本例為 jira -->
<issueManagement>
<!-- 問(wèn)題管理系統(tǒng)(例如jira)的名字, -->
<system> jira </system>
<!-- 該項(xiàng)目使用的問(wèn)題管理系統(tǒng)的URL -->
<url> http://jira.clf.com/ </url>
</issueManagement>
<!-- 項(xiàng)目持續(xù)集成信息 -->
<ciManagement>
<!-- 持續(xù)集成系統(tǒng)的名字遇伞,例如continuum -->
<system>continumm</system>
<!-- 該項(xiàng)目使用的持續(xù)集成系統(tǒng)的URL(如果持續(xù)集成系統(tǒng)有web接口的話(huà))辙喂。 -->
<url>http://127.0.0.1:8080/continuum</url>
<!-- 構(gòu)建完成時(shí),需要通知的開(kāi)發(fā)者/用戶(hù)的配置項(xiàng)鸠珠。包括被通知者信息和通知條件(錯(cuò)誤巍耗,失敗,成功渐排,警告) -->
<notifiers>
<!-- 配置一種方式炬太,當(dāng)構(gòu)建中斷時(shí),以該方式通知用戶(hù)/開(kāi)發(fā)者 -->
<notifier>
<!-- 傳送通知的途徑 -->
<type />
<!-- 發(fā)生錯(cuò)誤時(shí)是否通知 -->
<sendOnError />
<!-- 構(gòu)建失敗時(shí)是否通知 -->
<sendOnFailure />
<!-- 構(gòu)建成功時(shí)是否通知 -->
<sendOnSuccess />
<!-- 發(fā)生警告時(shí)是否通知 -->
<sendOnWarning />
<!-- 不贊成使用驯耻。通知發(fā)送到哪里 -->
<address />
<!-- 擴(kuò)展配置項(xiàng) -->
<configuration />
</notifier>
</notifiers>
</ciManagement>
<!-- 項(xiàng)目的名稱(chēng), Maven產(chǎn)生的文檔用 -->
<name> banseon-maven </name>
<!-- 項(xiàng)目主頁(yè)的URL, Maven產(chǎn)生的文檔用 -->
<url> http://www.clf.com/ </url>
<!-- 項(xiàng)目的詳細(xì)描述, Maven 產(chǎn)生的文檔用亲族。 當(dāng)這個(gè)元素能夠用HTML格式描述時(shí)
(例如,CDATA中的文本會(huì)被解析器忽略可缚,就可以包含HTML標(biāo)簽)霎迫,不鼓勵(lì)使用純文本描述。
如果你需要修改產(chǎn)生的web站點(diǎn)的索引頁(yè)面帘靡,你應(yīng)該修改你自己的索引頁(yè)文件知给,而不是調(diào)整這里的文檔。 -->
<description> A maven project to study maven. </description>
<!-- 描述了這個(gè)項(xiàng)目構(gòu)建環(huán)境中的前提條件描姚。 -->
<prerequisites>
<!-- 構(gòu)建該項(xiàng)目或使用該插件所需要的Maven的最低版本 -->
<maven />
</prerequisites>
<!-- 項(xiàng)目創(chuàng)建年份涩赢,4位數(shù)字。當(dāng)產(chǎn)生版權(quán)信息時(shí)需要使用這個(gè)值轩勘。 -->
<inceptionYear />
<!-- 項(xiàng)目相關(guān)郵件列表信息 -->
<mailingLists>
<!-- 該元素描述了項(xiàng)目相關(guān)的所有郵件列表筒扒。自動(dòng)產(chǎn)生的網(wǎng)站引用這些信息。 -->
<mailingList>
<!-- 郵件的名稱(chēng) -->
<name> Demo </name>
<!-- 發(fā)送郵件的地址或鏈接绊寻,如果是郵件地址花墩,創(chuàng)建文檔時(shí),mailto: 鏈接會(huì)被自動(dòng)創(chuàng)建 -->
<post> clf@126.com </post>
<!-- 訂閱郵件的地址或鏈接榛斯,如果是郵件地址观游,創(chuàng)建文檔時(shí),mailto: 鏈接會(huì)被自動(dòng)創(chuàng)建 -->
<subscribe> clf@126.com </subscribe>
<!-- 取消訂閱郵件的地址或鏈接驮俗,如果是郵件地址懂缕,創(chuàng)建文檔時(shí),mailto: 鏈接會(huì)被自動(dòng)創(chuàng)建 -->
<unsubscribe> clf@126.com </unsubscribe>
<!-- 你可以瀏覽郵件信息的URL -->
<archive> http:/hi.clf.com/ </archive>
</mailingList>
</mailingLists>
<!-- 項(xiàng)目開(kāi)發(fā)者列表 -->
<developers>
<!-- 某個(gè)項(xiàng)目開(kāi)發(fā)者的信息 -->
<developer>
<!-- SCM里項(xiàng)目開(kāi)發(fā)者的唯一標(biāo)識(shí)符 -->
<id> HELLO WORLD </id>
<!-- 項(xiàng)目開(kāi)發(fā)者的全名 -->
<name> banseon </name>
<!-- 項(xiàng)目開(kāi)發(fā)者的email -->
<email> banseon@126.com </email>
<!-- 項(xiàng)目開(kāi)發(fā)者的主頁(yè)的URL -->
<url />
<!-- 項(xiàng)目開(kāi)發(fā)者在項(xiàng)目中扮演的角色王凑,角色元素描述了各種角色 -->
<roles>
<role> Project Manager </role>
<role> Architect </role>
</roles>
<!-- 項(xiàng)目開(kāi)發(fā)者所屬組織 -->
<organization> demo </organization>
<!-- 項(xiàng)目開(kāi)發(fā)者所屬組織的URL -->
<organizationUrl> http://hi.clf.com/ </organizationUrl>
<!-- 項(xiàng)目開(kāi)發(fā)者屬性搪柑,如即時(shí)消息如何處理等 -->
<properties>
<dept> No </dept>
</properties>
<!-- 項(xiàng)目開(kāi)發(fā)者所在時(shí)區(qū)聋丝, -11到12范圍內(nèi)的整數(shù)。 -->
<timezone> -5 </timezone>
</developer>
</developers>
<!-- 項(xiàng)目的其他貢獻(xiàn)者列表 -->
<contributors>
<!-- 項(xiàng)目的其他貢獻(xiàn)者工碾。參見(jiàn)developers/developer元素 -->
<contributor>
<name /><email /><url /><organization /><organizationUrl />
<roles /><timezone /><properties />
</contributor>
</contributors>
<!-- 該元素描述了項(xiàng)目所有License列表弱睦。應(yīng)該只列出該項(xiàng)目的license列表,不要列出依賴(lài)項(xiàng)目的license列表渊额。
如果列出多個(gè)license况木,用戶(hù)可以選擇它們中的一個(gè)而不是接受所有l(wèi)icense。 -->
<licenses>
<!-- 描述了項(xiàng)目的license旬迹,用于生成項(xiàng)目的web站點(diǎn)的license頁(yè)面火惊,其他一些報(bào)表和validation也會(huì)用到該元素。 -->
<license>
<!-- license用于法律上的名稱(chēng) -->
<name> Apache 2 </name>
<!-- 官方的license正文頁(yè)面的URL -->
<url> http://www.clf.com/LICENSE-2.0.txt </url>
<!-- 項(xiàng)目分發(fā)的主要方式:
repo奔垦,可以從Maven庫(kù)下載
manual屹耐, 用戶(hù)必須手動(dòng)下載和安裝依賴(lài) -->
<distribution> repo </distribution>
<!-- 關(guān)于license的補(bǔ)充信息 -->
<comments> A business-friendly OSS license </comments>
</license>
</licenses>
<!-- SCM(Source Control Management)標(biāo)簽允許你配置你的代碼庫(kù),供Maven web站點(diǎn)和其它插件使用椿猎。 -->
<scm>
<!-- SCM的URL,該URL描述了版本庫(kù)和如何連接到版本庫(kù)惶岭。欲知詳情,請(qǐng)看SCMs提供的URL格式和列表犯眠。該連接只讀按灶。 -->
<connection>scm:svn:http://svn.baidu.com/banseon/maven/</connection>
<!-- 給開(kāi)發(fā)者使用的,類(lèi)似connection元素阔逼。即該連接不僅僅只讀 -->
<developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/</developerConnection>
<!-- 當(dāng)前代碼的標(biāo)簽兆衅,在開(kāi)發(fā)階段默認(rèn)為HEAD -->
<tag />
<!-- 指向項(xiàng)目的可瀏覽SCM庫(kù)(例如ViewVC或者Fisheye)的URL地沮。 -->
<url> http://svn.baidu.com/banseon </url>
</scm>
<!-- 描述項(xiàng)目所屬組織的各種屬性嗜浮。Maven產(chǎn)生的文檔用 -->
<organization>
<!-- 組織的全名 -->
<name> demo </name>
<!-- 組織主頁(yè)的URL -->
<url> http://www.clf.com/ </url>
</organization>
2.7 profile
pom.xml中的profile可以看做pom.xml的副本,擁有與pom.xml相同的子元素與配置方法摩疑。它包含可選的activation(profile的觸發(fā)器)和一系列的changes危融。例如test過(guò)程可能會(huì)指向不同的數(shù)據(jù)庫(kù)(相對(duì)最終的deployment)或者不同的dependencies或者不同的repositories,并且是根據(jù)不同的JDK來(lái)改變的雷袋。只需要其中一個(gè)成立就可以激活profile吉殃,如果第一個(gè)條件滿(mǎn)足了,那么后面就不會(huì)在進(jìn)行匹配楷怒。
<!-- 在列的項(xiàng)目構(gòu)建profile蛋勺,如果被激活,會(huì)修改構(gòu)建處理 -->
<profiles>
<!-- 根據(jù)環(huán)境參數(shù)或命令行參數(shù)激活某個(gè)構(gòu)建處理 -->
<profile>
<!--自動(dòng)觸發(fā)profile的條件邏輯鸠删。Activation是profile的開(kāi)啟鑰匙抱完。-->
<activation>
<!--profile默認(rèn)是否激活的標(biāo)識(shí) -->
<activeByDefault>false</activeByDefault>
<!--activation有一個(gè)內(nèi)建的java版本檢測(cè),如果檢測(cè)到j(luò)dk版本與期待的一樣刃泡,profile被激活巧娱。 -->
<jdk>1.7</jdk>
<!--當(dāng)匹配的操作系統(tǒng)屬性被檢測(cè)到碉怔,profile被激活。os元素可以定義一些操作系統(tǒng)相關(guān)的屬性禁添。 -->
<os>
<!--激活profile的操作系統(tǒng)的名字 -->
<name>Windows XP</name>
<!--激活profile的操作系統(tǒng)所屬家族(如 'windows') -->
<family>Windows</family>
<!--激活profile的操作系統(tǒng)體系結(jié)構(gòu) -->
<arch>x86</arch>
<!--激活profile的操作系統(tǒng)版本 -->
<version>5.1.2600</version>
</os>
<!--如果Maven檢測(cè)到某一個(gè)屬性(其值可以在POM中通過(guò)${名稱(chēng)}引用)撮胧,其擁有對(duì)應(yīng)的名稱(chēng)和值,Profile就會(huì)被激活老翘。
如果值字段是空的芹啥,那么存在屬性名稱(chēng)字段就會(huì)激活profile,否則按區(qū)分大小寫(xiě)方式匹配屬性值字段 -->
<property>
<!--激活profile的屬性的名稱(chēng) -->
<name>mavenVersion</name>
<!--激活profile的屬性的值 -->
<value>2.0.3</value>
</property>
<!--提供一個(gè)文件名铺峭,通過(guò)檢測(cè)該文件的存在或不存在來(lái)激活profile叁征。missing檢查文件是否存在,如果不存在則激活profile逛薇。
另一方面捺疼,exists則會(huì)檢查文件是否存在,如果存在則激活profile永罚。 -->
<file>
<!--如果指定的文件存在啤呼,則激活profile。 -->
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
<!--如果指定的文件不存在呢袱,則激活profile官扣。 -->
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
</file>
</activation>
<id />
<build />
<modules />
<repositories />
<pluginRepositories />
<dependencies />
<reporting />
<dependencyManagement />
<distributionManagement />
<properties />
</profile>
</profiles>
profile可以讓maven能夠自動(dòng)適應(yīng)外部的環(huán)境變化,比如同一個(gè)項(xiàng)目羞福,在linux下編譯linux的版本惕蹄,在win下編譯win的版本等。一個(gè)項(xiàng)目可以設(shè)置多個(gè)profile治专,也可以在同一時(shí)間設(shè)置多個(gè)profile被激活(active)的卖陵。自動(dòng)激活的 profile的條件可以是各種各樣的設(shè)定條件,組合放置在activation節(jié)點(diǎn)中张峰,也可以通過(guò)命令行直接指定泪蔫。如果認(rèn)為profile設(shè)置比較復(fù)雜,可以將所有的profiles內(nèi)容移動(dòng)到專(zhuān)門(mén)的 profiles.xml 文件中喘批,不過(guò)記得和pom.xml放在一起撩荣。
activation節(jié)點(diǎn)是設(shè)置該profile在什么條件下會(huì)被激活,常見(jiàn)的條件有如下幾個(gè).
2.7.1 os
判斷操作系統(tǒng)相關(guān)的參數(shù)饶深,它包含如下可以自由組合的子節(jié)點(diǎn)元素
message - 規(guī)則失敗之后顯示的消息
arch - 匹配cpu結(jié)構(gòu)餐曹,常見(jiàn)為x86
family - 匹配操作系統(tǒng)家族,常見(jiàn)的取值為:dos敌厘,mac台猴,netware,os/2,unix卿吐,windows旁舰,win9x,os/400等
name - 匹配操作系統(tǒng)的名字
version - 匹配的操作系統(tǒng)版本號(hào)
display - 檢測(cè)到操作系統(tǒng)之后顯示的信息
2.7.2 jdk
檢查jdk版本嗡官,可以用區(qū)間表示箭窜。
2.7.3 property
檢查屬性值,本節(jié)點(diǎn)可以包含name和value兩個(gè)子節(jié)點(diǎn)衍腥。
2.7.4 file
檢查文件相關(guān)內(nèi)容磺樱,包含兩個(gè)子節(jié)點(diǎn):exists和missing,用于分別檢查文件存在和不存在兩種情況婆咸。
如果想要某個(gè)profile默認(rèn)處于激活狀態(tài)竹捉,可以在<activeProfiles>中將該profile的id放進(jìn)去。這樣尚骄,不論環(huán)境設(shè)置如何块差,其對(duì)應(yīng)的 profile都會(huì)被激活。
profile配置項(xiàng)在setting.xml中頁(yè)有倔丈,是pom.xml中profile元素的裁剪版本憨闰,包含了id,activation, repositories, pluginRepositories和 properties元素需五。這里的profile元素只包含這五個(gè)子元素是因?yàn)閟etting.xml只關(guān)心構(gòu)建系統(tǒng)這個(gè)整體(這正是settings.xml文件的角色定位)鹉动,而非單獨(dú)的項(xiàng)目對(duì)象模型設(shè)置。如果一個(gè)settings中的profile被激活宏邮,它的值會(huì)覆蓋任何其它定義在POM中或者profile.xml中的帶有相同id的profile泽示。