Maven 哲學(xué)
Maven最初的誕生就是希望Apache的一些項(xiàng)目能夠以相同的方式來(lái)開(kāi)發(fā)和構(gòu)建。
這樣一個(gè)開(kāi)發(fā)者從一個(gè)項(xiàng)目轉(zhuǎn)到另外一個(gè)項(xiàng)目工作的時(shí)候能夠更加輕松地切換。因?yàn)轫?xiàng)目的開(kāi)發(fā)、測(cè)試、文檔生成、報(bào)表和部署,都具有一些共同的特征,這些特征就可以認(rèn)為是軟件開(kāi)發(fā)過(guò)程中的一些最佳實(shí)踐,當(dāng)這些最佳實(shí)踐成為共識(shí),開(kāi)發(fā)的協(xié)作必然會(huì)更加高效。那么Maven要做的就是把這些最佳實(shí)踐固化成一個(gè)通用的項(xiàng)目管理方法。
盡管對(duì)于不同的項(xiàng)目,開(kāi)發(fā)中各個(gè)階段會(huì)有所不同,但是確實(shí)可以找到一條普遍適用的路徑,Maven將這條路徑以非常清晰的方式結(jié)合各種實(shí)踐模式提供給開(kāi)發(fā)者
坐標(biāo)規(guī)劃的原則
現(xiàn)實(shí)自然項(xiàng)目結(jié)構(gòu):
-公司或組織架構(gòu)
-- 項(xiàng)目a
-- 項(xiàng)目b
-- 模塊api
-- 模塊controller
-- 模塊facade
-- 模塊service
-- 模塊module
....
....
則為了避免沖突,規(guī)劃原則:
<groupId>公司或者組織+項(xiàng)目</groupId>
<artifactId>項(xiàng)目+模塊</artifactId>
<version><主版本>.<次版本>.<增量版本>-<限定符></version>
<packaging>...</packaging>
1.概述
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>
2.基本配置
modelVersion:pom模型版本,maven2和3只能為4.0.0
groupId:組ID,maven用于定位
artifactId:在組中的唯一ID用于定位
version:項(xiàng)目版本
packaging:項(xiàng)目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par
3.依賴配置
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)目的構(gòu)件標(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)目的版本
modules
有些maven項(xiàng)目會(huì)做成多模塊的,這個(gè)標(biāo)簽用于指定當(dāng)前項(xiàng)目所包含的所有模塊。之后對(duì)這個(gè)項(xiàng)目進(jìn)行的maven操作,會(huì)讓所有子模塊也進(jìn)行相同操作。
<modules>
<module>com-a</>
<module>com-b</>
<module>com-c</>
</>
properties
用于定義pom常量
<properties>
<java.version>1.7</java.version>
</properties>
上面這個(gè)常量可以在pom文件的任意地方通過(guò)${java.version}來(lái)引用
dependencies
項(xiàng)目相關(guān)依賴配置,如果在父項(xiàng)目寫(xiě)的依賴,會(huì)被子項(xiàng)目引用,一般父項(xiàng)目會(huì)將子項(xiàng)目公用的依賴引入(將在之后詳細(xì)講解)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
這邊依賴和中央倉(cāng)庫(kù)中的一致,就可以引入對(duì)應(yīng)的jar
dependencyManagement
在多模塊Maven項(xiàng)目中,dependencyManagement幾乎是必不可少的,因?yàn)橹挥兴遣拍軌蛴行У貛臀覀兙S護(hù)依賴一致性。
配置寫(xiě)法同dependencies
<dependencyManagement>
<dependencies>
.....
</dependencies>
</dependencyManagement>
在父模塊中定義后,子模塊不會(huì)直接使用對(duì)應(yīng)依賴,但是在使用相同依賴的時(shí)候可以不加版本號(hào):
父項(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>
這樣的好處是,父項(xiàng)目統(tǒng)一了版本,而且子項(xiàng)目可以在需要的時(shí)候才引用對(duì)應(yīng)的依賴
- 我們知道Maven的繼承和Java的繼承一樣,是無(wú)法實(shí)現(xiàn)多重繼承的,如果10個(gè)、20個(gè)甚至更多模塊繼承自同一個(gè)模塊,那么按照我們之前的做法,這個(gè)父模塊的dependencyManagement會(huì)包含大量的依賴。如果你想把這些依賴分類(lèi)以更清晰的管理,那就不可能了,import scope依賴能解決這個(gè)問(wèn)題。你可以把dependencyManagement放到單獨(dú)的專(zhuān)門(mén)用來(lái)管理依賴的POM中,然后在需要使用依賴的模塊中通過(guò)import scope依賴,就可以引入dependencyManagement。例如可以寫(xiě)這樣一個(gè)用于依賴管理的POM:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.sample</groupId>
<artifactId>sample-dependency-infrastructure</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后我就可以通過(guò)非繼承的方式來(lái)引入這段依賴管理配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.juvenxu.sample</groupId>
<artifactid>sample-dependency-infrastructure</artifactId>
<version>1.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>
這樣,父模塊的POM就會(huì)非常干凈,由專(zhuān)門(mén)的packaging為pom的POM來(lái)管理依賴,也契合的面向?qū)ο笤O(shè)計(jì)中的單一職責(zé)原則。此外,我們還能夠創(chuàng)建多個(gè)這樣的依賴管理POM,以更細(xì)化的方式管理依賴。這種做法與面向?qū)ο笤O(shè)計(jì)中使用組合而非繼承也有點(diǎn)相似的味道。
消除多模塊插件配置重復(fù)
與dependencyManagement類(lèi)似的,我們也可以使用pluginManagement元素管理插件。一個(gè)常見(jiàn)的用法就是我們希望項(xiàng)目所有模塊的使用Maven Compiler Plugin的時(shí)候,都使用Java 1.5,以及指定Java源文件編碼為UTF-8,這時(shí)可以在父模塊的POM中如下配置pluginManagement:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
這段配置會(huì)被應(yīng)用到所有子模塊的maven-compiler-plugin中,由于Maven內(nèi)置了maven-compiler-plugin與生命周期的綁定,因此子模塊就不再需要任何maven-compiler-plugin的配置了。
與依賴配置不同的是,通常所有項(xiàng)目對(duì)于任意一個(gè)依賴的配置都應(yīng)該是統(tǒng)一的,但插件卻不是這樣,例如你可以希望模塊A運(yùn)行所有單元測(cè)試,模塊B要跳過(guò)一些測(cè)試,這時(shí)就需要配置maven-surefire-plugin來(lái)實(shí)現(xiàn),那樣兩個(gè)模塊的插件配置就不一致了。這也就是說(shuō),簡(jiǎn)單的把插件配置提取到父POM的pluginManagement中往往不適合所有情況,那我們?cè)谑褂玫臅r(shí)候就需要注意了,只有那些普適的插件配置才應(yīng)該使用pluginManagement提取到父POM中。
關(guān)于插件pluginManagement,Maven并沒(méi)有提供與import scope依賴類(lèi)似的方式管理,那我們只能借助繼承關(guān)系,不過(guò)好在一般來(lái)說(shuō)插件配置的數(shù)量遠(yuǎn)沒(méi)有依賴配置那么多,因此這也不是一個(gè)問(wèn)題。
4.構(gòu)建配置
build
用于配置項(xiàng)目構(gòu)建相關(guān)信息
<build>
<!--該元素設(shè)置了項(xiàng)目源碼目錄,當(dāng)構(gòu)建項(xiàng)目的時(shí)候,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼。該路徑是相對(duì)于pom.xml的相對(duì)路徑。-->
<sourceDirectory/>
<!--該元素設(shè)置了項(xiàng)目腳本源碼目錄,該目錄和源碼目錄不同:絕大多數(shù)情況下,該目錄下的內(nèi)容 會(huì)被拷貝到輸出目錄(因?yàn)槟_本是被解釋的,而不是被編譯的)。-->
<scriptSourceDirectory/>
<!--該元素設(shè)置了項(xiàng)目單元測(cè)試使用的源碼目錄,當(dāng)測(cè)試項(xiàng)目的時(shí)候,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼。該路徑是相對(duì)于pom.xml的相對(duì)路徑。-->
<testSourceDirectory/>
<!--被編譯過(guò)的應(yīng)用程序class文件存放的目錄。-->
<outputDirectory/>
<!--被編譯過(guò)的測(cè)試class文件存放的目錄。-->
<testOutputDirectory/>
<!--使用來(lái)自該項(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)目沒(méi)有規(guī)定目標(biāo)(Maven2 叫做階段)時(shí)的默認(rèn)值-->
<defaultGoal/>
<!--這個(gè)元素描述了項(xiàng)目相關(guān)的所有資源路徑列表,例如和項(xiàng)目相關(guān)的屬性文件,這些資源被包含在最終的打包文件里。-->
<resources>
<!--這個(gè)元素描述了項(xiàng)目相關(guān)或測(cè)試相關(guān)的所有資源路徑-->
<resource>
<!-- 描述了資源的目標(biāo)路徑。該路徑相對(duì)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/>
<!--描述存放資源的目錄,該路徑相對(duì)POM路徑-->
<directory/>
<!--包含的模式列表,例如**/*.xml.-->
<includes/>
<!--排除的模式列表,例如**/*.xml-->
<excludes/>
</resource>
</resources>
<!--這個(gè)元素描述了單元測(cè)試相關(guān)的所有資源路徑,例如和單元測(cè)試相關(guān)的屬性文件。-->
<testResources>
<!--這個(gè)元素描述了測(cè)試相關(guān)的所有資源路徑,參見(jiàn)build/resources/resource元素的說(shuō)明-->
<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開(kāi)關(guān)打開(kāi)時(shí),使用到的過(guò)濾器屬性文件列表-->
<filters/>
<!--子項(xiàng)目可以引用的默認(rèn)插件信息。該插件配置項(xiàng)直到被引用時(shí)才會(huì)被解析或綁定到生命周期。給定插件的任何本地配置都會(huì)覆蓋這里的配置-->
<pluginManagement>
<!--使用的插件列表 。-->
<plugins>
<!--plugin元素包含描述插件所需要的信息。-->
<plugin>
<!--插件在倉(cāng)庫(kù)里的group ID-->
<groupId/>
<!--插件在倉(cāng)庫(kù)里的artifact ID-->
<artifactId/>
<!--被使用的插件的版本(或版本范圍)-->
<version/>
<!--是否從該插件下載Maven擴(kuò)展(例如打包和類(lèi)型處理器),由于性能原因,只有在真需要下載時(shí),該元素才被設(shè)置成enabled。-->
<extensions/>
<!--在構(gòu)建生命周期中執(zhí)行一組目標(biāo)的配置。每個(gè)目標(biāo)可能有不同的配置。-->
<executions>
<!--execution元素包含了插件執(zhí)行需要的信息-->
<execution>
<!--執(zhí)行目標(biāo)的標(biāo)識(shí)符,用于標(biāo)識(shí)構(gòu)建過(guò)程中的目標(biāo),或者匹配繼承過(guò)程中需要合并的執(zhí)行目標(biāo)-->
<id/>
<!--綁定了目標(biāo)的構(gòu)建生命周期階段,如果省略,目標(biāo)會(huì)被綁定到源數(shù)據(jù)里配置的默認(rèn)階段-->
<phase/>
<!--配置的執(zhí)行目標(biāo)-->
<goals/>
<!--配置是否被傳播到子POM-->
<inherited/>
<!--作為DOM對(duì)象的配置-->
<configuration/>
</execution>
</executions>
<!--項(xiàng)目引入插件所需要的額外依賴-->
<dependencies>
<!--參見(jiàn)dependencies/dependency元素-->
<dependency>
......
</dependency>
</dependencies>
<!--任何配置是否被傳播到子項(xiàng)目-->
<inherited/>
<!--作為DOM對(duì)象的配置-->
<configuration/>
</plugin>
</plugins>
</pluginManagement>
<!--使用的插件列表-->
<plugins>
<!--參見(jiàn)build/pluginManagement/plugins/plugin元素-->
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<!--參見(jiàn)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)表就會(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元素包含描述報(bào)表插件需要的信息-->
<plugin>
<!--報(bào)表插件在倉(cāng)庫(kù)里的group ID-->
<groupId/>
<!--報(bào)表插件在倉(cāng)庫(kù)里的artifact ID-->
<artifactId/>
<!--被使用的報(bào)表插件的版本(或版本范圍)-->
<version/>
<!--任何配置是否被傳播到子項(xiàng)目-->
<inherited/>
<!--報(bào)表插件的配置-->
<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/>
<!--產(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:主頁(yè)的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用于法律上的名稱(chēng)-->
<name>...</name>
<!--官方的license正文頁(yè)面的URL-->
<url>....</url>
<!--項(xiàng)目分發(fā)的主要方式:repo,可以從Maven庫(kù)下載 manual, 用戶必須手動(dòng)下載和安裝依賴-->
<distribution>repo</distribution>
<!--關(guān)于license的補(bǔ)充信息-->
<comments>....</comments>
</license>
organization:1.name 組織名 2.url 組織主頁(yè)url
developers:項(xiàng)目開(kāi)發(fā)人員列表(如下)
contributors:項(xiàng)目其他貢獻(xiàn)者列表,同developers
<developers>
<!--某個(gè)開(kāi)發(fā)者信息-->
<developer>
<!--開(kāi)發(fā)者的唯一標(biāo)識(shí)符-->
<id>....</id>
<!--開(kāi)發(fā)者的全名-->
<name>...</name>
<!--開(kāi)發(fā)者的email-->
<email>...</email>
<!--開(kāi)發(fā)者的主頁(yè)-->
<url>...<url/>
<!--開(kāi)發(fā)者在項(xiàng)目中的角色-->
<roles>
<role>Java Dev</role>
<role>Web UI</role>
</roles>
<!--開(kāi)發(fā)者所屬組織-->
<organization>sun</organization>
<!--開(kāi)發(fā)者所屬組織的URL-->
<organizationUrl>...</organizationUrl>
<!--開(kāi)發(fā)者屬性,如即時(shí)消息如何處理等-->
<properties>
<!-- 和主標(biāo)簽中的properties一樣,可以隨意定義子標(biāo)簽 -->
</properties>
<!--開(kāi)發(fā)者所在時(shí)區(qū), -11到12范圍內(nèi)的整數(shù)。-->
<timezone>-5</timezone>
</developer>
</developers>
6.環(huán)境設(shè)置
issueManagement
目的問(wèn)題管理系統(tǒng)(Bugzilla, Jira, Scarab)的名稱(chēng)和URL
<issueManagement>
<system>Bugzilla</system>
<url>http://127.0.0.1/bugzilla/</url>
</issueManagement>
system:系統(tǒng)類(lèi)型
url:路徑
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í),需要通知的開(kāi)發(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: 鏈接會(huì)被自動(dòng)創(chuàng)建
archive:瀏覽郵件信息的URL
post:接收郵件的地址
scm
允許你配置你的代碼庫(kù),供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的版本庫(kù)。connection只提供讀,developerConnection將提供寫(xiě)的請(qǐng)求
寫(xiě)法如:scm:[provider]:[provider_specific]
如果連接到CVS倉(cāng)庫(kù),可以配置如下:scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
tag:項(xiàng)目標(biāo)簽,默認(rèn)HEAD
url:共有倉(cāng)庫(kù)路徑
prerequisites
項(xiàng)目構(gòu)建的前提
<prerequisites>
<maven>2.0.6</maven>
</prerequisites>
repositories,pluginRepositories
依賴和擴(kuò)展的遠(yuǎn)程倉(cāng)庫(kù)列表,同上篇文章,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ú)立倉(cāng)庫(kù)任意類(lèi)型的依賴改變策略。如:一個(gè)人可能只激活下載snapshot用來(lái)開(kāi)發(fā)。
enable:true或者false,決定倉(cāng)庫(kù)是否對(duì)于各自的類(lèi)型激活(release 或者 snapshot)。
updatePolicy: 這個(gè)元素決定更新頻率。maven將比較本地pom的時(shí)間戳(存儲(chǔ)在倉(cāng)庫(kù)的maven數(shù)據(jù)文件中)和遠(yuǎn)程的. 有以下選擇: always, daily (默認(rèn)), interval:X (x是代表分鐘的整型) , never.
checksumPolicy:當(dāng)Maven向倉(cāng)庫(kù)部署文件的時(shí)候,它也部署了相應(yīng)的校驗(yàn)和文件。可選的為:ignore,fail,warn,或者不正確的校驗(yàn)和。
layout:在上面描述倉(cāng)庫(kù)的時(shí)候,提到他們有統(tǒng)一的布局。Maven 2有它倉(cāng)庫(kù)默認(rèn)布局。然而,Maven 1.x有不同布局。使用這個(gè)元素來(lái)表明它是default還是legacy。
distributionManagement
它管理的分布在整個(gè)構(gòu)建過(guò)程生成的工件和支持文件
<distributionManagement>
...
<downloadUrl>http://mojo.codehaus.org/my-project</downloadUrl>
<status>deployed</status>
</distributionManagement>
downloadUrl: 其他pom可以通過(guò)此url的倉(cāng)庫(kù)抓取組件
status:給出該構(gòu)件在遠(yuǎn)程倉(cāng)庫(kù)的狀態(tài)
none: 默認(rèn)
converted: 將被早期Maven 2 POM轉(zhuǎn)換過(guò)來(lái)
partner: 這個(gè)項(xiàng)目會(huì)從合作者倉(cāng)庫(kù)同步過(guò)來(lái)
deployed: 從Maven 2或3實(shí)例部署
verified: 被核實(shí)時(shí)正確的和最終的
Repository
指定Maven pom從遠(yuǎn)程下載控件到當(dāng)前項(xiàng)目的位置和方式,如果snapshotRepository沒(méi)有被定義則使用repository相關(guān)的配置
<distributionManagement>
<repository>
<uniqueVersion>false</uniqueVersion>
<id>corp1</id>
<name>Corporate Repository</name>
<url>scp://repo/maven2</url>
<layout>default</layout>
</repository>
<snapshotRepository>
<uniqueVersion>true</uniqueVersion>
<id>propSnap</id>
<name>Propellors Snapshots</name>
<url>sftp://propellers.net/maven</url>
<layout>legacy</layout>
</snapshotRepository>
...
</distributionManagement>
id, name:倉(cāng)庫(kù)的唯一標(biāo)識(shí)
uniqueVersion:true或false,指明控件部署的時(shí)候是否獲取獨(dú)立的版本號(hào)。
url:repository元素的核心。指定位置和部署協(xié)議發(fā)布控件到倉(cāng)庫(kù)。
layout:布局,default或legacy
Site Distribution
多分布存儲(chǔ)庫(kù),distributionManagement負(fù)責(zé)定義如何部署項(xiàng)目的網(wǎng)站和文檔。
<distributionManagement>
...
<site>
<id>mojo.website</id>
<name>Mojo Website</name>
<url>scp://beaver.codehaus.org/home/projects/mojo/public_html/</url>
</site>
...
</distributionManagement>
Relocation
重新部署-項(xiàng)目不是靜態(tài)的,是活的。他們需要被搬到更合適的地方。如:當(dāng)你的下個(gè)成功的開(kāi)源項(xiàng)目移到Apache下,重命名為org.apache:my-project:1.0 對(duì)你項(xiàng)目更有好處。
<distributionManagement>
...
<relocation>
<groupId>org.apache</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<message>We have moved the Project under Apache</message>
</relocation>
...
</distributionManagement>
profiles
profile可以讓我們定義一系列的配置信息(插件等),然后指定其激活條件 profile的相關(guān)配置可以參考上篇文章Maven實(shí)戰(zhàn)(二)–setting.xml詳解: