Maven 哲學(xué)
Maven最初的誕生就是希望Apache的一些項(xiàng)目能夠以相同的方式來開發(fā)和構(gòu)建。
這樣一個(gè)開發(fā)者從一個(gè)項(xiàng)目轉(zhuǎn)到另外一個(gè)項(xiàng)目工作的時(shí)候能夠更加輕松地切換鞍盗。因?yàn)轫?xiàng)目的開發(fā)、測試涂籽、文檔生成铡溪、報(bào)表和部署,都具有一些共同的特征显拳,這些特征就可以認(rèn)為是軟件開發(fā)過程中的一些最佳實(shí)踐,當(dāng)這些最佳實(shí)踐成為共識(shí)搓萧,開發(fā)的協(xié)作必然會(huì)更加高效杂数。那么Maven要做的就是把這些最佳實(shí)踐固化成一個(gè)通用的項(xiàng)目管理方法。
盡管對于不同的項(xiàng)目瘸洛,開發(fā)中各個(gè)階段會(huì)有所不同揍移,但是確實(shí)可以找到一條普遍適用的路徑,Maven將這條路徑以非常清晰的方式結(jié)合各種實(shí)踐模式提供給開發(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)养距,然后在本地倉庫诉探,再在遠(yuǎn)程倉庫找。
version:父項(xiàng)目的版本
modules
有些maven項(xiàng)目會(huì)做成多模塊的棍厌,這個(gè)標(biāo)簽用于指定當(dāng)前項(xiàng)目所包含的所有模塊肾胯。之后對這個(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文件的任意地方通過${java.version}來引用
dependencies
項(xiàng)目相關(guān)依賴配置敬肚,如果在父項(xiàng)目寫的依賴,會(huì)被子項(xiàng)目引用揣炕,一般父項(xiàng)目會(huì)將子項(xiàng)目公用的依賴引入(將在之后詳細(xì)講解)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
這邊依賴和中央倉庫中的一致帘皿,就可以引入對應(yīng)的jar
dependencyManagement
在多模塊Maven項(xiàng)目中,dependencyManagement幾乎是必不可少的畸陡,因?yàn)橹挥兴遣拍軌蛴行У貛臀覀兙S護(hù)依賴一致性。
配置寫法同dependencies
<dependencyManagement>
<dependencies>
.....
</dependencies>
</dependencyManagement>
在父模塊中定義后虽填,子模塊不會(huì)直接使用對應(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í)候才引用對應(yīng)的依賴
- 我們知道Maven的繼承和Java的繼承一樣牲览,是無法實(shí)現(xiàn)多重繼承的,如果10個(gè)恶守、20個(gè)甚至更多模塊繼承自同一個(gè)模塊第献,那么按照我們之前的做法贡必,這個(gè)父模塊的dependencyManagement會(huì)包含大量的依賴。如果你想把這些依賴分類以更清晰的管理庸毫,那就不可能了仔拟,import scope依賴能解決這個(gè)問題。你可以把dependencyManagement放到單獨(dú)的專門用來管理依賴的POM中飒赃,然后在需要使用依賴的模塊中通過import scope依賴利花,就可以引入dependencyManagement。例如可以寫這樣一個(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>
然后我就可以通過非繼承的方式來引入這段依賴管理配置:
<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ì)非常干凈炒事,由專門的packaging為pom的POM來管理依賴,也契合的面向?qū)ο笤O(shè)計(jì)中的單一職責(zé)原則蔫慧。此外挠乳,我們還能夠創(chuàng)建多個(gè)這樣的依賴管理POM,以更細(xì)化的方式管理依賴姑躲。這種做法與面向?qū)ο笤O(shè)計(jì)中使用組合而非繼承也有點(diǎn)相似的味道欲侮。
消除多模塊插件配置重復(fù)
與dependencyManagement類似的,我們也可以使用pluginManagement元素管理插件肋联。一個(gè)常見的用法就是我們希望項(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)目對于任意一個(gè)依賴的配置都應(yīng)該是統(tǒng)一的,但插件卻不是這樣宪哩,例如你可以希望模塊A運(yùn)行所有單元測試娩贷,模塊B要跳過一些測試,這時(shí)就需要配置maven-surefire-plugin來實(shí)現(xiàn)锁孟,那樣兩個(gè)模塊的插件配置就不一致了彬祖。這也就是說,簡單的把插件配置提取到父POM的pluginManagement中往往不適合所有情況品抽,那我們在使用的時(shí)候就需要注意了储笑,只有那些普適的插件配置才應(yīng)該使用pluginManagement提取到父POM中。
關(guān)于插件pluginManagement圆恤,Maven并沒有提供與import scope依賴類似的方式管理突倍,那我們只能借助繼承關(guān)系,不過好在一般來說插件配置的數(shù)量遠(yuǎn)沒有依賴配置那么多,因此這也不是一個(gè)問題羽历。
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ì)編譯目錄里的源碼秕磷。該路徑是相對于pom.xml的相對路徑诵闭。-->
<sourceDirectory/>
<!--該元素設(shè)置了項(xiàng)目腳本源碼目錄,該目錄和源碼目錄不同:絕大多數(shù)情況下跳夭,該目錄下的內(nèi)容 會(huì)被拷貝到輸出目錄(因?yàn)槟_本是被解釋的涂圆,而不是被編譯的)。-->
<scriptSourceDirectory/>
<!--該元素設(shè)置了項(xiàng)目單元測試使用的源碼目錄币叹,當(dāng)測試項(xiàng)目的時(shí)候润歉,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼。該路徑是相對于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í)才會(huì)被解析或綁定到生命周期巍沙。給定插件的任何本地配置都會(huì)覆蓋這里的配置-->
<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)識(shí)符蠢笋,用于標(biāo)識(shí)構(gòu)建過程中的目標(biāo),或者匹配繼承過程中需要合并的執(zhí)行目標(biāo)-->
<id/>
<!--綁定了目標(biāo)的構(gòu)建生命周期階段鳞陨,如果省略昨寞,目標(biāo)會(huì)被綁定到源數(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)表就會(huì)運(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)識(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:主頁的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)識(shí)符-->
<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)境設(shè)置
issueManagement
目的問題管理系統(tǒng)(Bugzilla, Jira, Scarab)的名稱和URL
<issueManagement>
<system>Bugzilla</system>
<url>http://127.0.0.1/bugzilla/</url>
</issueManagement>
system:系統(tǒng)類型
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í)抢韭,需要通知的開發(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
允許你配置你的代碼庫,供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í)間戳(存儲(chǔ)在倉庫的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宴猾。
distributionManagement
它管理的分布在整個(gè)構(gòu)建過程生成的工件和支持文件
<distributionManagement>
...
<downloadUrl>http://mojo.codehaus.org/my-project</downloadUrl>
<status>deployed</status>
</distributionManagement>
downloadUrl: 其他pom可以通過此url的倉庫抓取組件
status:給出該構(gòu)件在遠(yuǎn)程倉庫的狀態(tài)
none: 默認(rèn)
converted: 將被早期Maven 2 POM轉(zhuǎn)換過來
partner: 這個(gè)項(xiàng)目會(huì)從合作者倉庫同步過來
deployed: 從Maven 2或3實(shí)例部署
verified: 被核實(shí)時(shí)正確的和最終的
Repository
指定Maven pom從遠(yuǎn)程下載控件到當(dāng)前項(xiàng)目的位置和方式,如果snapshotRepository沒有被定義則使用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:倉庫的唯一標(biāo)識(shí)
uniqueVersion:true或false叼旋,指明控件部署的時(shí)候是否獲取獨(dú)立的版本號(hào)仇哆。
url:repository元素的核心。指定位置和部署協(xié)議發(fā)布控件到倉庫夫植。
layout:布局讹剔,default或legacy
Site Distribution
多分布存儲(chǔ)庫,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è)成功的開源項(xiàng)目移到Apache下阐斜,重命名為org.apache:my-project:1.0 對你項(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詳解: