- 前言
- 什么是 POM
- Quick Overview
- POM 常用元素
- pom.xml 完整注釋
- 參考
0 前言
什么是 POM鲫尊?
就像 Make 的 MakeFile堡牡、Ant 的 build.xml 一樣槐瑞,Maven 項目的核心是 pom.xml
。POM( Project Object Model,項目對象模型 ) 定義了項目的基本信息臀脏,用于描述項目如何構(gòu)建虏冻,聲明項目依賴肤粱,等等。
Quick Overview
一個完整的 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">
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
tips:這里的 pom.xml
的 modelVersion
為 4.0.
1 POM 常用元素
1.1 The Basics
1.1.1 Maven 坐標(biāo)( Coordinate )
在 Maven 中坐標(biāo)是構(gòu)件的唯一標(biāo)識领曼,Maven 坐標(biāo)的元素包括 groupId
、artifactId
领铐、version
悯森、packaging
、classifier
绪撵。上述5個元素中瓢姻,groupId
、artifactId
音诈、version
是必須定義的幻碱,packaging
是可選的 ( 默認(rèn)為 jar )绎狭。
- groupId:組織標(biāo)識,一般為:公司網(wǎng)址的反寫+項目名
- artifactId:項目名稱褥傍,一般為:項目名-模塊名
- version:版本號
- packaging:打包的方式儡嘶,如:pom, jar, maven-plugin, ejb, war, ...
- clissifier:用來幫助定義構(gòu)件輸出的一些附屬構(gòu)件』蟹纾可參考此文
另外蹦狂,關(guān)于 版本號 ,形式為0.0.1-SNAPSHOT
:
- 第一個
0
表示大版本號朋贬,第二個0
表示分支版本號凯楔,第三個0
表示小版本號 -
SNAPSHOT
-- 快照版本,ALPHA
-- 內(nèi)側(cè)版本锦募,BETA
-- 公測版本摆屯,RELEASE
-- 穩(wěn)定版本,GA
-- 正式發(fā)布
在我們開發(fā)自己的 maven 項目的時候糠亩,需要為其定義適當(dāng)?shù)淖鴺?biāo)虐骑,如:
<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>
<!-- 項目的全球唯一標(biāo)識符,通常使用全限定的包名區(qū)分該項目和其他項目赎线。并且構(gòu)建時生成的路徑也是由此生成廷没, 如com.seyvoue.demo生成的相對路徑為:/com/seyvoue/demo-->
<groupId>com.seyvoue.demo</groupId>
<!-- 構(gòu)件的標(biāo)識符,它和 groupId 一起唯一標(biāo)識一個構(gòu)件氛驮。換句話說腕柜,你不能有兩個不同的項目擁有同樣的 artifactId 和 groupId;在某個特定的 groupId 下矫废,artifactId也必須是唯一的盏缤。-->
<artifactId>demo-maven</artifactId>
<!-- 項目當(dāng)前版本,格式為:主版本.次版本.增量版本-限定版本號-->
<version>1.0.0-SNAPSHOT</version>
<!-- 項目產(chǎn)生的構(gòu)件類型蓖扑,例如 jar唉铜、war、pom 等律杠。插件可以創(chuàng)建他們自己的構(gòu)件類型潭流,所以前面列的不是全部構(gòu)件類型-->
<packaging>jar</packaging>
...
</project>
1.1.2 依賴: <dependencies>...</dependencies>
比如,我的項目 project-demo1
需要添加 junit
依賴:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
dependencies
元素柜去,包括以下子元素:
- groupId, artifactId, version
這三個是必須的灰嫉,以下的那些子元素根據(jù)實(shí)際情況添加。
- scope
scope 元素為 maven dependency 下一個控制作用域的子元素嗓奢,控制該依賴包在什么情況下會被加到 classpath 中讼撒。共 6 種 scope,包括:
compile
、provided
根盒、runtime
钳幅、test
、system
炎滞、import
敢艰。
( 具體可參考@POM Dependency Scope )
- type
對于于
<packaging>...</packaging>
,即指定依賴包的后綴册赛,默認(rèn)為jar
- optional
如果當(dāng)前仙姑是 projectA钠导,projectA 需要依賴 projectB,而 projectB 的 optional 為 true森瘪,表示依賴可選辈双,那么之后所有聲明依賴 projectA 的項目如果也依賴 projectB,就必須手動聲明柜砾。
比如,projectC 依賴 projectA 和 projectB换衬,如果 projectC只聲明了對 projectA 的依賴痰驱,那么 projectB 不會自動加入依賴,projectA 必須手動加入對 projectB 的依賴瞳浦。
也就是說依賴傳遞被打斷了担映。
- exclusions
依賴傳遞:如果我們的項目引用了一個 Jar 包,而該 Jar 包又引用了其他 Jar 包叫潦,那么在默認(rèn)情況下項目編譯時蝇完,Maven 會把直接引用和間接引用的 Jar 包都下載到本地。
排除依賴:如果我們只想下載直接引用的 Jar包矗蕊,
那么需要在 pom.xml 中做如下配置:(將需要排除的 Jar 包的坐標(biāo)寫在中)
<dependency>
...
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
...
</dependency>
依賴沖突:若項目中多個 Jar 同時引用了相同的 Jar 時短蜕,會產(chǎn)生依賴沖突,但 Maven 采用了兩種避免沖突的策略傻咖,因此在 Maven 中是不存在依賴沖突的朋魔。
- 短路優(yōu)先
本項目——>A.jar——>B.jar——>X.jar
本項目——>C.jar——>X.jar
若本項目引用了 A.jar,A.jar 又引用了 B.jar卿操,B.jar 又引用了 X.jar警检,并且 C.jar 也引用了X.jar。
在此時害淤,Maven 只會引用引用路徑最短的Jar扇雕。- 聲明優(yōu)先
若引用路徑長度相同時,在pom.xml中誰先被聲明窥摄,就使用誰镶奉。
1.1.3 聚合: <modules>...</modules>
通過
<modules>...<modules>
元素可將多個模塊聚合在同一個 project 下。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.seyvoue.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
...
<!--模塊(有時稱作子項目) 被構(gòu)建成項目的一部分。列出的每個模塊元素是指向該模塊的目錄的相對路徑-->
<modules>
<module>account-email</module>
<module>account-persist</module>
</modules>
</project>
1.1.4 繼承: <parent>...</parent> 和 <dependencyManagement>...</dependencyManagement>
在聚合多個項目時腮鞍,如果這些被聚合的項目中需要引入相同的 Jar值骇,那么可以將這些 Jar 寫入 父pom 中,各個子項目繼承該pom即可移国。類似與 java 中的繼承吱瘩。
(具體可參考@Maven的聚合與繼承)
如何實(shí)現(xiàn)繼承? 示例如下:
- 父 pom.xml:
<packaging>...</packaging>
必須配置為pom
- 將需要繼承的 Jar 包的坐標(biāo)放入
<dependencyManagement>...</dependencyManagement>
內(nèi)即可<project> <modelVersion>4.0.0</modelVersion> <groupId>com.seyvoue.demo</groupId> <artifactId> demo-maven </artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> ... <properties> <spring.version>4.0.2.RELEASE</spring.version> <junit.versoin>4.7</junit.version> ... </properties> <!-- 繼承自該項目的所有子項目的默認(rèn)依賴信息迹缀。這部分的依賴信息不會被立即解析,而是當(dāng)子項目聲明一個依賴(必須描述group ID和 artifact ID信息)使碾,如果group ID和artifact ID以外的一些信息沒有描述,則通過group ID和artifact ID 匹配到這里的依賴祝懂,并使用這里的依賴信息票摇。--> <dependencyManagement> <dependencies> <dependency> <groupId>com.github.brevy</groupId> <artifactId>shiro-spring</artifactId> <version>1.2.2</version> </dependency> ... </dependencies> </dependencyManagement> ... </project>
- 子 pom.xml:
在
<parent>...</parent>
標(biāo)簽內(nèi)添加 父pom.xml 的坐標(biāo)<project> <modelVersion>4.0.0</modelVersion> ... <parent> <groupId>com.seyvoue.demo</groupId> <artifactId> demo-maven </artifactId> <version>1.0.0-SNAPSHOT</version> <!-- 父pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑砚蓬。默認(rèn)值是../ pom.xml矢门。Maven首先在構(gòu)建當(dāng)前項目的地方尋找父pom.xml,其次在文件系統(tǒng)的這個位置(relativePath位置)灰蛙,然后在本地倉庫祟剔,最后在遠(yuǎn)程倉庫尋找父項目的pom。--> <relativePath>...</relativePath> </parent> <!-- 子 POM 若引用父 POM 在 dependencyManagement 中定義過的依賴摩梧,則只需填寫 groupId 和 artifactid物延,其它的信息則會從父 POM 中繼承 --> <dependencies> <dependency> <groupId>com.github.brevy</groupId> <artifactId>shiro-spring</artifactId> </dependency> ... </dependencies> ... </project>
- Maven 可繼承的 POM 元素:
groupId :項目組 ID ,項目坐標(biāo)的核心元素仅父;
version :項目版本叛薯,項目坐標(biāo)的核心元素;
description :項目的描述信息笙纤;
organization :項目的組織信息耗溜;
inceptionYear :項目的創(chuàng)始年份;
url :項目的 url 地址
develoers :項目的開發(fā)者信息省容;
contributors :項目的貢獻(xiàn)者信息强霎;
distributionManagerment :項目的部署信息;
issueManagement :缺陷跟蹤系統(tǒng)信息蓉冈;
ciManagement :項目的持續(xù)繼承信息城舞;
scm :項目的版本控制信息;
mailingListserv :項目的郵件列表信息寞酿;
properties :自定義的 Maven 屬性家夺;
dependencies :項目的依賴配置;
dependencyManagement :醒目的依賴管理配置伐弹;
repositories :項目的倉庫配置拉馋;
build :包括項目的源碼目錄配置、輸出目錄配置、插件配置煌茴、插件管理配置等随闺;
reporting :包括項目的報告輸出目錄配置、報告插件配置等蔓腐。
1.1.5 屬性:<properties>...</properties> 和 &{}
Maven 的 properties 加載順序:
- <build><filters> 中的配置
- pom.xml 中的 <properties>
- mvn -Dproperty=value 中定義的 property
相同 key 的 property矩乐,以最后一個文件中的配置為最終配置。
<project>
...
<properties>
<maven.compiler.source>1.7<maven.compiler.source>
<maven.compiler.target>1.7<maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
...
</project>
通過 properties
元素用戶可以定義一個或多個 maven 屬性回论,然后在 maven 的其他地方使用 ${屬性名稱}
的方式引用該屬性散罕,這種做法的意義在于消除重復(fù)和統(tǒng)一管理。比如傀蓉,需要在多個地方重復(fù)聲明同樣的 SpringFramework 版本欧漱,現(xiàn)在只需要在一個地方聲明就可以。Maven 共有6種屬性(根據(jù)引用的來源不同):內(nèi)置屬性葬燎、POM 屬性误甚、自定義屬性、Settings 屬性谱净、環(huán)境變量屬性等靶草,引用方式是類似的,下面介紹其中的集中
- 內(nèi)置屬性
兩個常用內(nèi)置屬性:
${basedir}
表示項目根目錄${version}
表示項目版本
- POM 屬性
用戶可以使用該類屬性引用 pom.xml 中對應(yīng)元素的值岳遥,如
${project.artifactId}
就對應(yīng)了<project><artifactId></artifactId></project>
中的值。常用的 POM 屬性包括:
${project.build.sourceDirectory}
表示項目的主源碼目錄裕寨,默認(rèn)為src/main/java
${project.build.testDirectory}
表示項目的測試源碼目錄浩蓉,默認(rèn)為src/test/java
${project.build.directory}
表示項目項目構(gòu)建輸出目錄,默認(rèn)為/target
${project.outputDirectory}
表示項目主代碼編譯輸出目錄宾袜,默認(rèn)為/target/classes
${project.build.filename}
表示項目打包輸出文件的名稱捻艳,默認(rèn)為${project.artifactId}-${project.version}
- 自定義屬性
用戶可以在 pom.xml 的
<properties/>
元素下定義自己的 Maven 屬性。如:<project> ... <properties> <my.group>hello</my.group> </properties> ... </project>
- settings 屬性
與 POM 屬性同理庆猫。maven settings.xml 中定義的內(nèi)容认轨,可以通過
settings
前綴進(jìn)行引用。${settings.localRepository} 表示 maven 本地倉庫的路徑 ${settings.offline} 表示構(gòu)建系統(tǒng)是否在離線模式下工作
1.2 Build Settings
根據(jù) POM 4.0.0 XSD月培,build 元素概念性的劃分為兩個部分:BaseBuild(包含 poject build 和 profile build 的公共部分嘁字,見下)和 poject build 包含的一些高級特性。
<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">
...
<!-- "Project Build" contains more elements than just the BaseBuild set -->
<build>...</build>
<profiles>
<profile>
<!-- "Profile Build" contains a subset of "Project Build"s elements -->
<build>...</build>
</profile>
</profiles>
</project>
1.2.1 <build>...</build>
1.2.1.1 The BaseBuild Element Set
Basic Elements
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
- defaultGoal:執(zhí)行build任務(wù)時杉畜,如果沒有指定目標(biāo)纪蜒,將使用的默認(rèn)值,如:在命令行中執(zhí)行mvn此叠,則相當(dāng)于執(zhí)行mvn install纯续;
- directory:build目標(biāo)文件的存放目錄,默認(rèn)在
${basedir}/target目錄
- finalName:build目標(biāo)文件的文件名,默認(rèn)情況下為
${artifactId}-${version}
- filter:定義*.properties文件猬错,包含一個properties列表窗看,該列表會應(yīng)用的支持filter的resources中。也就是說倦炒,定義在filter的文件中的"name=value"值對會在build時代替
${name}
值應(yīng)用到 resources 中显沈。Maven的默認(rèn)filter文件夾是${basedir}/src/main/filters/
<Resources>...</Resources>
Maven 屬性默認(rèn)只有在 pom.xml 中才會被解析,對于放在
src/main/resources/
目錄下的文件析校,maven 是需要通過maven-resources-plugin
插件幫忙處理的构罗,它默認(rèn)的行為是將項目資源文件復(fù)制到代碼編譯輸出目錄中,不過只要通過一些簡單的 POM 配置智玻,該插件就能解析資源文件中的 Maven 屬性遂唧,即開啟資源過濾。
resources(通常)不是代碼吊奢,他們不被編譯盖彭,但是被綁定在你的項目或者用于其它什么原因,例如代碼生成页滚。<build> ... <resources> <resource> <targetPath>META-INF/plexus</targetPath> <filtering>false</filtering> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> <testResources> ... </testResources> ... </build>
- resources:一個resource元素的列表召边,每一個都描述與項目關(guān)聯(lián)的文件是什么和在哪里;
- targetPath:指定build后的resource存放的文件夾裹驰。該路徑默認(rèn)是basedir隧熙。通常被打包在JAR中的resources的目標(biāo)路徑為META-INF;
- filtering:true/false幻林,表示為這個resource贞盯,filter是否激活。
- directory:定義resource所在的文件夾沪饺,默認(rèn)為
${basedir}/src/main/resources
- includes:指定作為resource的文件的匹配模式躏敢,用
*
作為通配符;- excludes:指定哪些文件被忽略整葡,如果一個文件同時符合
includes
和excludes
件余,則excludes
生效;- testResources:定義和 resource 類似遭居,但只在
test
時使用啼器,默認(rèn)的test resource
文件夾路徑是${basedir}/src/test/resources
,test resource
不被部署俱萍。
<plugins>...</plugins>
<plugins/>
給出構(gòu)建過程中所用到的插件镀首,以及可以在這個元素下對插件進(jìn)行配置。<build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <extensions>false</extensions> <inherited>true</inherited> <configuration> <classifier>test</classifier> </configuration> <dependencies>...</dependencies> <executions> <excution> <id>echodir</id> <goals> <goal>run</goal> </goals> <phase>verify</phase> <inherited>false</inherited> <configuration> <task> <echo>Build Dir: ${project.build.directory}</echo> </task> </configuration> </excution> </executions> </plugin> </plugins> </build>
- extensions:是否加載該插件的擴(kuò)展鼠次,默認(rèn)false
- inherited:該插件的 configuration 中的配置是否可以被(繼承該P(yáng)OM的其他Maven項目)繼承更哄,默認(rèn)true
- configuration:該插件所需要的特殊配置芋齿,在父子項目之間可以覆蓋或合并
- dependencies:該插件所特有的依賴類庫
- executions:plugin 可以有多個目標(biāo),每一個目標(biāo)都可以有一個分開的配置成翩,甚至可以綁定一個 plugin 的目標(biāo)到一個不同的階段觅捆。executions 配置一個 plugin 的目標(biāo)的 execution。一個 execution 有如下設(shè)置:
- id栅炒,唯一標(biāo)識
- goals术羔,要執(zhí)行的插件的 goal(可以有多個),如
<goal>run</goal>
- phase级历,目標(biāo)執(zhí)行的階段,具體值看Maven的生命周期列表
- inherited玩讳,該 execution 是否可被子項目繼承
- configuration,該 execution 的其他配置參數(shù)
<pluginManagement>...<pluginManagement>
在
<build>
中嚼贡,<pluginManagement>
與<plugins>
并列,兩者之間的關(guān)系類似于<dependencyManagement>
與<dependencies>
之間的關(guān)系樟澜。<pluginManagement>
中也配置<plugin>
秩贰,其配置參數(shù)與<plugins>
中的<plugin>
完全一致熊户。只是嚷堡,<pluginManagement>
往往出現(xiàn)在父項目中蝌戒,其中配置的<plugin>
往往通用于子項目沼琉。子項目中只要在<plugins>
中以<plugin>
聲明該插件打瘪,該插件的具體配置參數(shù)則繼承自父項目中<pluginManagement>
對該插件的配置,從而避免在子項目中進(jìn)行重復(fù)配置妆档。
1.2.2 <reporting>...</reporting>
<reporting> 中的配置作用于 Maven 的 site 階段( 見 Maven 生命周期)贾惦,用于生成報表须板。<reporting> 中也可以配置插件 <plugins>兢卵,并通過一個 <plugin> 的 <reportSet>為該插件配置參數(shù)济蝉。注意王滤,對于同時出現(xiàn)在 <build> 和 <reporting> 中的插件雁乡,<reporting> 中對該插件的配置也能夠在構(gòu)建過程中生效踱稍,即該插件的配置是<build>和<reporting>中的配置的合并珠月。
1.3 Environment Settings
<SCM>...</SCM>
Maven中為我們集成了軟件配置管理的(SCM:Software Configuration Management)功能啤挎,他可以支持我們常用SVN庆聘、CVS等伙判,共支持18個命令:
scm:branch - branch the project(創(chuàng)建項目的分支) scm:validate - validate the scm information in the pom(校驗(yàn)SCM的配置信息) scm:add - command to add file(增加一個文件) scm:unedit - command to stop editing the working copy(停止編輯當(dāng)前COPY) scm:export - command to get a fresh exported copy(拉一個全新的分支) scm:bootstrap - command to checkout and build a project(checkout并編譯工程) scm:changelog - command to show the source code revisions(顯示源碼版本) scm:list - command for get the list of project files(列出工程的文件) scm:checkin - command for commiting changes(提交變更) scm:checkout - command for getting the source code(獲取源碼) scm:status - command for showing the scm status of the working copy(獲取本地項目的狀態(tài)) scm:update - command for updating the working copy with the latest changes(從服務(wù)器獲取最新的版本) scm:diff - command for showing the difference of the working copy with the remote one(比較本地與遠(yuǎn)程服務(wù)器的差異) scm:update-subprojects - command for updating all projects in a multi project build(更新子項目) scm:edit - command for starting edit on the working copy(編輯) scm:tag - command for tagging a certain revision(打標(biāo)簽)
tips:而其中的 mvn scm:checkin
, mvn scm:update
是其中比較常用的命令宴抚。
比如,對 git
的配置如下:
<project> ... <scm> <!--SCM的URL,該URL描述了版本庫和如何連接到版本庫危虱。欲知詳情埃跷,請看SCMs提供的URL格式和列表弥雹。該連接只讀剪勿。--> <connection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) </connection> <!--給開發(fā)者使用的厕吉,類似connection元素头朱。即該連接不僅僅只讀--> <developerConnection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk </developerConnection> <!--當(dāng)前代碼的標(biāo)簽项钮,在開發(fā)階段默認(rèn)為HEAD--> <tag/> <!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL烁巫。--> <url>http://svn.baidu.com/banseon</url> </scm> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> <configuration> <tagBase>${git.conn}</tagBase> <branchBase>${git.conn}</branchBase> <username>${git.username}</username> <password>${git.password}</password> </configuration> </plugin> ... </project>
<distributionManagement>...</distributionManagement>
maven 中的倉庫分為兩種亚隙,snapshot 快照倉庫和 release 發(fā)布倉庫阿弃。snapshot 快照倉庫用于保存開發(fā)過程中的不穩(wěn)定版本恤浪,release 正式倉庫則是用來保存穩(wěn)定的發(fā)行版本。定義一個組件/模塊為快照版本赛蔫,只需要在 pom 文件中在該模塊的版本號后加上-SNAPSHOT即可(注意這里必須是大寫)呵恢,在distributionManagement段中配置的是snapshot快照庫和release發(fā)布庫的地>址渗钉。
<project>
<!--項目分發(fā)信息鳄橘,在執(zhí)行mvn deploy后表示要發(fā)布的位置瘫怜。有了這些信息就可以把網(wǎng)站部署到遠(yuǎn)程服務(wù)器或者把構(gòu)件部署到遠(yuǎn)程倉庫鲸湃。-->
<distributionManagement>
<!--部署項目產(chǎn)生的構(gòu)件到遠(yuǎn)程倉庫需要的信息-->
<repository>
<id>${distribution.releases.id}</id>
<url>${distribution.releases.url}</url>
</repository>
<snapshotRepository>
<id>${distribution.snapshots.id}</id>
<url>${distribution.snapshots.url}</url>
</snapshotRepository>
</distributionManagement>
</project>
<profiles>...</profiles>
不同環(huán)境的構(gòu)建很可能是不同的暗挑,典型的情況就是數(shù)據(jù)庫的配置窿祥。要想使得一個構(gòu)建不做任何修改就能在任何環(huán)境下運(yùn)行,往往是不可能的嗤瞎,為了能讓構(gòu)建在各個環(huán)境下方便地移植贝奇,Maven 引入了 profile 的概念掉瞳,profile 能夠在構(gòu)建的時候選擇性的激活 pom.xml 中的元素陕习。用戶可以使用很多方式激活 profile该镣,以實(shí)現(xiàn)構(gòu)建在不同環(huá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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> ... <profiles> <profile> <id>test</id> <activation>...</activation> <build>...</build> <modules>...</modules> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <dependencies>...</dependencies> <reporting>...</reporting> <dependencyManagement>...</dependencyManagement> <distributionManagement>...</distributionManagement> </profile> </profiles> </project>
2. 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">
<modelVersion>4.0.0</modelVersion>
<!-- 項目的全球唯一標(biāo)識符跋炕,通常使用全限定的包名區(qū)分該項目和其他項目辐烂。并且構(gòu)建時生成的路徑也是由此生成棉圈, 如com.seyvoue.demo生成的相對路徑為:/com/seyvoue/demo-->
<groupId>com.seyvoue.demo</groupId>
<!-- 構(gòu)件的標(biāo)識符分瘾,它和 groupId 一起唯一標(biāo)識一個構(gòu)件德召。換句話說上岗,你不能有兩個不同的項目擁有同樣的 artifactId 和 groupId肴掷;在某個特定的 groupId 下呆瞻,artifactId也必須是唯一的痴脾。-->
<artifactId>demo-maven</artifactId>
<!-- 項目當(dāng)前版本赞赖,格式為:主版本.次版本.增量版本-限定版本號-->
<version>1.0.0-SNAPSHOT</version>
<!-- 項目產(chǎn)生的構(gòu)件類型,例如 jar匿垄、war年堆、pom 等变丧。插件可以創(chuàng)建他們自己的構(gòu)件類型痒蓬,所以前面列的不是全部構(gòu)件類型-->
<packaging>jar</packaging>
<!-- 項目的名稱攻晒,Maven產(chǎn)生的文檔用-->
<name>project-demo</name>
<!-- 項目主頁的URL鲁捏,Maven產(chǎn)生的文檔用-->
<url>http://demo.seyvoue.com</url>
<!-- 項目的詳細(xì)描述, Maven 產(chǎn)生的文檔用给梅。當(dāng)這個元素能夠用HTML格式描述時(例如动羽,CDATA中的文本會被解析器忽略运吓,就可以包含HTML標(biāo)簽)拘哨, 不鼓勵使用純文本描述宅静。如果你需要修改產(chǎn)生的web站點(diǎn)的索引頁面,你應(yīng)該修改你自己的索引頁文件磷账,而不是調(diào)整這里的文檔逃糟。-->
<description>A demo of maven project to study maven.</description>
<parent>
<!--被繼承的父項目的構(gòu)件標(biāo)識符-->
<artifactId/>
<!--被繼承的父項目的全球唯一標(biāo)識符-->
<groupId/>
<!--被繼承的父項目的版本-->
<version/>
<!-- 父項目的pom.xml文件的相對路徑绰咽。相對路徑允許你選擇一個不同的路徑取募。默認(rèn)值是../pom.xml玩敏。Maven首先在構(gòu)建當(dāng)前項目的地方尋找父項目的pom织阳,其次在文件系統(tǒng)的這個位置(relativePath位置)唧躲,然后在本地倉庫惊窖,最后在遠(yuǎn)程倉庫尋找父項目的pom界酒。-->
<relativePath/>
</parent>
<!-- 繼承自該項目的所有子項目的默認(rèn)依賴信息毁欣。這部分的依賴信息不會被立即解析,而是當(dāng)子項目聲明一個依賴(必須描述group ID和 artifact ID信息)凭疮,如果group ID和artifact ID以外的一些信息沒有描述执解,則通過group ID和artifact ID 匹配到這里的依賴,并使用這里的依賴信息千扔。-->
<dependencyManagement>
<dependencies>
<!--參見dependencies/dependency元素-->
<dependency>
...
</dependency>
</dependencies>
</dependencyManagement>
<!--該元素描述了項目相關(guān)的所有依賴伏伐。 這些依賴組成了項目構(gòu)建過程中的一個個環(huán)節(jié)萝风。它們自動從項目定義的倉庫中下載睬塌。要獲取更多信息,請看項目依賴機(jī)制堕花。-->
<dependencies>
<dependency>
<!--依賴的group ID-->
<groupId>org.apache.maven</groupId>
<!--依賴的artifact ID-->
<artifactId>maven-artifact</artifactId>
<!--依賴的版本號缘挽。 在Maven 2里, 也可以配置成版本號的范圍壕曼。-->
<version>3.8.1</version>
<!-- 依賴類型,默認(rèn)類型是jar轧飞。它通常表示依賴的文件的擴(kuò)展名过咬,但也有例外掸绞。一個類型可以被映射成另外一個擴(kuò)展名或分類器衔掸。類型經(jīng)常和使用的打包方式對應(yīng), 這也有例外驱显。一些類型的例子:jar埃疫,war翠桦,ejb-client和test-jar销凑。如果設(shè)置extensions為 true斗幼,就可以在 plugin里定義新的類型蜕窿。所以前面的類型的例子不完整桐经。-->
<type>jar</type>
<!-- 依賴的分類器阴挣。分類器可以區(qū)分屬于同一個POM,但不同構(gòu)建方式的構(gòu)件盒卸。分類器名被附加到文件名的版本號后面蔽介。例如,如果你想要構(gòu)建兩個單獨(dú)的構(gòu)件成 JAR薇组,一個使用Java 4編譯器律胀,另一個使用Java 6編譯器罪佳,你就可以使用分類器來生成兩個單獨(dú)的JAR構(gòu)件赘艳。-->
<classifier></classifier>
<!--依賴范圍。在項目發(fā)布過程中掰曾,幫助決定哪些構(gòu)件被包括進(jìn)來婴梧。欲知詳情請參考依賴機(jī)制。
- compile :默認(rèn)范圍讶坯,用于編譯
- provided:類似于編譯,但支持你期待jdk或者容器提供婉烟,類似于classpath
- runtime: 在執(zhí)行時需要使用
- test: 用于test任務(wù)時使用
- system: 需要外在提供相應(yīng)的元素。通過systemPath來取得
- systemPath: 僅用于范圍為system昙衅。提供相應(yīng)的路徑
- optional: 當(dāng)項目自身被依賴時,標(biāo)注依賴是否傳遞定鸟。用于連續(xù)依賴時使用-->
<scope>test</scope>
<!--僅供system范圍使用而涉。注意,不鼓勵使用這個元素联予,并且在新的版本中該元素可能被覆蓋掉啼县。該元素為依賴規(guī)定了文件系統(tǒng)上的路徑材原。需要絕對路徑而不是相對路徑谭羔。推薦使用屬性匹配絕對路徑华糖,例{java. home}。-->
<systemPath></systemPath>
<!--當(dāng)計算傳遞依賴時瘟裸, 從依賴構(gòu)件列表里客叉,列出被排除的依賴構(gòu)件集。即告訴maven你只依賴指定的項目话告,不依賴項目的依賴兼搏。此元素主要用于解決版本沖突問題-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可選依賴,如果你在項目B中把C依賴聲明為可選沙郭,你就需要在依賴于B的項目(例如項目A)中顯式的引用對C的依賴佛呻。可選依賴阻斷依賴的傳遞性病线。-->
<optional>true</optional>
</dependency>
...
</dependencies>
<!--模塊(有時稱作子項目) 被構(gòu)建成項目的一部分吓著。列出的每個模塊元素是指向該模塊的目錄的相對路徑-->
<modules>
<module>account-email</module>
<module>account-persist</module>
...
</modules>
<scm>
<!--SCM的URL,該URL描述了版本庫和如何連接到版本庫。欲知詳情送挑,請看SCMs提供的URL格式和列表绑莺。該連接只讀。-->
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<!--給開發(fā)者使用的惕耕,類似connection元素纺裁。即該連接不僅僅只讀-->
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<!--當(dāng)前代碼的標(biāo)簽,在開發(fā)階段默認(rèn)為HEAD-->
<tag/>
<!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL司澎。-->
<url>http://svn.baidu.com/banseon</url>
</scm>
<!--項目分發(fā)信息欺缘,在執(zhí)行mvn deploy后表示要發(fā)布的位置。有了這些信息就可以把網(wǎng)站部署到遠(yuǎn)程服務(wù)器或者把構(gòu)件部署到遠(yuǎn)程倉庫挤安。-->
<distributionManagement>
<!--部署項目產(chǎn)生的構(gòu)件到遠(yuǎn)程倉庫需要的信息-->
<repository>
<!--是分配給快照一個唯一的版本號(由時間戳和構(gòu)建流水號)谚殊?還是每次都使用相同的版本號?參見repositories/repository元素-->
<uniqueVersion/>
<id>banseon-maven2</id>
<name>banseon maven2</name>
<url>file://${basedir}/target/deploy</url>
<layout/>
</repository>
<!--構(gòu)件的快照部署到哪里蛤铜?如果沒有配置該元素嫩絮,默認(rèn)部署到repository元素配置的倉庫,參見distributionManagement/repository元素-->
<snapshotRepository>
<uniqueVersion/>
<id>banseon-maven2</id>
<name>Banseon-maven2 Snapshot Repository</name>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
<layout/>
</snapshotRepository>
<!--部署項目的網(wǎng)站需要的信息-->
<site>
<!--部署位置的唯一標(biāo)識符昂羡,用來匹配站點(diǎn)和settings.xml文件里的配置-->
<id>banseon-site</id>
<!--部署位置的名稱-->
<name>business api website</name>
<!--部署位置的URL絮记,按protocol://hostname/path形式-->
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
</url>
</site>
<!--項目下載頁面的URL。如果沒有該元素虐先,用戶應(yīng)該參考主頁怨愤。使用該元素的原因是:幫助定位那些不在倉庫里的構(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)件新的版本號-->
<version/>
<!--顯示給用戶的篮愉,關(guān)于移動的額外信息,例如原因差导。-->
<message/>
</relocation>
<!-- 給出該構(gòu)件在遠(yuǎn)程倉庫的狀態(tài)试躏。不得在本地項目中設(shè)置該元素,因?yàn)檫@是工具自動更新的设褐。有效的值有:none(默認(rèn))颠蕴,converted(倉庫管理員從 Maven 1 POM轉(zhuǎn)換過來),partner(直接從伙伴Maven 2倉庫同步過來)助析,deployed(從Maven 2實(shí)例部 署)犀被,verified(被核實(shí)時正確的和最終的)。-->
<status/>
</distributionManagement>
<build>
<!--當(dāng)項目沒有規(guī)定目標(biāo)(Maven2 叫做階段)時的默認(rèn)值-->
<defaultGoal>install</defaultGoal>
<!--build目標(biāo)文件的存放目錄外冀,默認(rèn)在 ${basedir}/target 目錄-->
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
<!--這個元素描述了項目相關(guān)的所有資源路徑列表寡键,例如和項目相關(guān)的屬性文件,這些資源被包含在最終的打包文件里雪隧。-->
<resources>
<!--這個元素描述了項目相關(guān)或測試相關(guān)的所有資源路徑-->
<resource>
<!-- 描述了資源的目標(biāo)路徑西轩。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。舉個例 子脑沿,如果你想資源在特定的包里( org.apache.maven.message藕畔,你就必須該元素設(shè)置為org/apache/maven /messages。然而捅伤,如果你只是想把資源放到源碼目錄結(jié)構(gòu)里劫流,就不需要該配置巫玻。-->
<targetPath/>
<!--是否使用參數(shù)值代替參數(shù)名丛忆。參數(shù)值取自properties元素或者文件里配置的屬性,文件在filters元素里列出仍秤。-->
<filtering/>
<!--描述存放資源的目錄熄诡,該路徑相對POM路徑-->
<directory/>
<!--包含的模式列表,例如**/*.xml.-->
<includes/>
<!--排除的模式列表诗力,例如**/*.xml-->
<excludes/>
</resource>
</resources>
<!--這個元素描述了單元測試相關(guān)的所有資源路徑凰浮,例如和單元測試相關(guān)的屬性文件。-->
<testResources>
<!--這個元素描述了測試相關(guān)的所有資源路徑苇本,參見build/resources/resource元素的說明-->
<testResource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<tagBase>${git.conn}</tagBase>
<branchBase>${git.conn}</branchBase>
<username>${git.username}</username>
<password>${git.password}</password>
</configuration>
</plugin>
...
</plugins>
<!--子項目可以引用的默認(rèn)插件信息袜茧。該插件配置項直到被引用時才會被解析或綁定到生命周期。給定插件的任何本地配置都會覆蓋這里的配置-->
<pluginManagement>
<plugins>
...
</plugins>
</pluginManagement>
</build>
</project>
參考
- POM Reference -- Apache Maven Project
- pom.xml 詳解 -- adeyi
- Maven實(shí)戰(zhàn) -- 許曉斌
- dependency 中的 classifier屬性
- 利用maven的filter和profile實(shí)現(xiàn)不同環(huán)境使用不同的配制
- 使用 maven profile
- Maven多環(huán)境配置實(shí)戰(zhàn) filter
- Maven Dependency Scope
- Maven基本命令 倉庫 坐標(biāo) 依賴 聚合 繼承 pom.xml詳解
- Maven pom.xml 配置詳解