- 前言
- 什么是 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 坐標( Coordinate )
在 Maven 中坐標是構(gòu)件的唯一標識,Maven 坐標的元素包括 groupId、artifactId、version、packaging、classifier。上述5個元素中,groupId、artifactId、version 是必須定義的,packaging 是可選的 ( 默認為 jar )。
- groupId:組織標識,一般為:公司網(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 項目的時候,需要為其定義適當?shù)淖鴺耍纾?/p>
<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>
<!-- 項目的全球唯一標識符,通常使用全限定的包名區(qū)分該項目和其他項目。并且構(gòu)建時生成的路徑也是由此生成, 如com.seyvoue.demo生成的相對路徑為:/com/seyvoue/demo-->
<groupId>com.seyvoue.demo</groupId>
<!-- 構(gòu)件的標識符,它和 groupId 一起唯一標識一個構(gòu)件。換句話說,你不能有兩個不同的項目擁有同樣的 artifactId 和 groupId;在某個特定的 groupId 下,artifactId也必須是唯一的。-->
<artifactId>demo-maven</artifactId>
<!-- 項目當前版本,格式為:主版本.次版本.增量版本-限定版本號-->
<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ù)實際情況添加。
- scope
scope 元素為 maven dependency 下一個控制作用域的子元素,控制該依賴包在什么情況下會被加到 classpath 中。共 6 種 scope,包括:
compile、provided、runtime、test、system、import。
( 具體可參考@POM Dependency Scope )
- type
對于于
<packaging>...</packaging>,即指定依賴包的后綴,默認為jar
- optional
如果當前仙姑是 projectA,projectA 需要依賴 projectB,而 projectB 的 optional 為 true,表示依賴可選,那么之后所有聲明依賴 projectA 的項目如果也依賴 projectB,就必須手動聲明。
比如,projectC 依賴 projectA 和 projectB,如果 projectC只聲明了對 projectA 的依賴,那么 projectB 不會自動加入依賴,projectA 必須手動加入對 projectB 的依賴。
也就是說依賴傳遞被打斷了。
- exclusions
依賴傳遞:如果我們的項目引用了一個 Jar 包,而該 Jar 包又引用了其他 Jar 包,那么在默認情況下項目編譯時,Maven 會把直接引用和間接引用的 Jar 包都下載到本地。
排除依賴:如果我們只想下載直接引用的 Jar包,
那么需要在 pom.xml 中做如下配置:(將需要排除的 Jar 包的坐標寫在中)
<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的聚合與繼承)
如何實現(xiàn)繼承? 示例如下:
- 父 pom.xml:
<packaging>...</packaging>必須配置為pom- 將需要繼承的 Jar 包的坐標放入
<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> <!-- 繼承自該項目的所有子項目的默認依賴信息。這部分的依賴信息不會被立即解析,而是當子項目聲明一個依賴(必須描述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>標簽內(nèi)添加 父pom.xml 的坐標<project> <modelVersion>4.0.0</modelVersion> ... <parent> <groupId>com.seyvoue.demo</groupId> <artifactId> demo-maven </artifactId> <version>1.0.0-SNAPSHOT</version> <!-- 父pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑。默認值是../ pom.xml。Maven首先在構(gòu)建當前項目的地方尋找父pom.xml,其次在文件系統(tǒng)的這個位置(relativePath位置),然后在本地倉庫,最后在遠程倉庫尋找父項目的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 ,項目坐標的核心元素;
version :項目版本,項目坐標的核心元素;
description :項目的描述信息;
organization :項目的組織信息;
inceptionYear :項目的創(chuàng)始年份;
url :項目的 url 地址
develoers :項目的開發(fā)者信息;
contributors :項目的貢獻者信息;
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}表示項目的主源碼目錄,默認為src/main/java${project.build.testDirectory}表示項目的測試源碼目錄,默認為src/test/java${project.build.directory}表示項目項目構(gòu)建輸出目錄,默認為/target${project.outputDirectory}表示項目主代碼編譯輸出目錄,默認為/target/classes${project.build.filename}表示項目打包輸出文件的名稱,默認為${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前綴進行引用。${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ù)時,如果沒有指定目標,將使用的默認值,如:在命令行中執(zhí)行mvn,則相當于執(zhí)行mvn install;
- directory:build目標文件的存放目錄,默認在
${basedir}/target目錄- finalName:build目標文件的文件名,默認情況下為
${artifactId}-${version}- filter:定義*.properties文件,包含一個properties列表,該列表會應(yīng)用的支持filter的resources中。也就是說,定義在filter的文件中的"name=value"值對會在build時代替
${name}值應(yīng)用到 resources 中。Maven的默認filter文件夾是${basedir}/src/main/filters/
<Resources>...</Resources>
Maven 屬性默認只有在 pom.xml 中才會被解析,對于放在
src/main/resources/目錄下的文件,maven 是需要通過maven-resources-plugin插件幫忙處理的,它默認的行為是將項目資源文件復(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存放的文件夾。該路徑默認是basedir。通常被打包在JAR中的resources的目標路徑為META-INF;
- filtering:true/false,表示為這個resource,filter是否激活。
- directory:定義resource所在的文件夾,默認為
${basedir}/src/main/resources- includes:指定作為resource的文件的匹配模式,用
*作為通配符;- excludes:指定哪些文件被忽略,如果一個文件同時符合
includes和excludes,則excludes生效;- testResources:定義和 resource 類似,但只在
test時使用,默認的test resource文件夾路徑是${basedir}/src/test/resources,test resource不被部署。
<plugins>...</plugins>
<plugins/>給出構(gòu)建過程中所用到的插件,以及可以在這個元素下對插件進行配置。<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:是否加載該插件的擴展,默認false
- inherited:該插件的 configuration 中的配置是否可以被(繼承該POM的其他Maven項目)繼承,默認true
- configuration:該插件所需要的特殊配置,在父子項目之間可以覆蓋或合并
- dependencies:該插件所特有的依賴類庫
- executions:plugin 可以有多個目標,每一個目標都可以有一個分開的配置,甚至可以綁定一個 plugin 的目標到一個不同的階段。executions 配置一個 plugin 的目標的 execution。一個 execution 有如下設(shè)置:
- id,唯一標識
- goals,要執(zhí)行的插件的 goal(可以有多個),如
<goal>run</goal>- phase,目標執(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>對該插件的配置,從而避免在子項目中進行重復(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(校驗SCM的配置信息) scm:add - command to add file(增加一個文件) scm:unedit - command to stop editing the working copy(停止編輯當前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(比較本地與遠程服務(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(打標簽)
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> <!--當前代碼的標簽,在開發(fā)階段默認為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)站部署到遠程服務(wù)器或者把構(gòu)件部署到遠程倉庫。-->
<distributionManagement>
<!--部署項目產(chǎn)生的構(gòu)件到遠程倉庫需要的信息-->
<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)境下運行,往往是不可能的,為了能讓構(gòu)建在各個環(huán)境下方便地移植,Maven 引入了 profile 的概念,profile 能夠在構(gòu)建的時候選擇性的激活 pom.xml 中的元素。用戶可以使用很多方式激活 profile,以實現(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>
<!-- 項目的全球唯一標識符,通常使用全限定的包名區(qū)分該項目和其他項目。并且構(gòu)建時生成的路徑也是由此生成, 如com.seyvoue.demo生成的相對路徑為:/com/seyvoue/demo-->
<groupId>com.seyvoue.demo</groupId>
<!-- 構(gòu)件的標識符,它和 groupId 一起唯一標識一個構(gòu)件。換句話說,你不能有兩個不同的項目擁有同樣的 artifactId 和 groupId;在某個特定的 groupId 下,artifactId也必須是唯一的。-->
<artifactId>demo-maven</artifactId>
<!-- 項目當前版本,格式為:主版本.次版本.增量版本-限定版本號-->
<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>
<!-- 項目的詳細描述, Maven 產(chǎn)生的文檔用。當這個元素能夠用HTML格式描述時(例如,CDATA中的文本會被解析器忽略,就可以包含HTML標簽), 不鼓勵使用純文本描述。如果你需要修改產(chǎn)生的web站點的索引頁面,你應(yīng)該修改你自己的索引頁文件,而不是調(diào)整這里的文檔。-->
<description>A demo of maven project to study maven.</description>
<parent>
<!--被繼承的父項目的構(gòu)件標識符-->
<artifactId/>
<!--被繼承的父項目的全球唯一標識符-->
<groupId/>
<!--被繼承的父項目的版本-->
<version/>
<!-- 父項目的pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑。默認值是../pom.xml。Maven首先在構(gòu)建當前項目的地方尋找父項目的pom,其次在文件系統(tǒng)的這個位置(relativePath位置),然后在本地倉庫,最后在遠程倉庫尋找父項目的pom。-->
<relativePath/>
</parent>
<!-- 繼承自該項目的所有子項目的默認依賴信息。這部分的依賴信息不會被立即解析,而是當子項目聲明一個依賴(必須描述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é)。它們自動從項目定義的倉庫中下載。要獲取更多信息,請看項目依賴機制。-->
<dependencies>
<dependency>
<!--依賴的group ID-->
<groupId>org.apache.maven</groupId>
<!--依賴的artifact ID-->
<artifactId>maven-artifact</artifactId>
<!--依賴的版本號。 在Maven 2里, 也可以配置成版本號的范圍。-->
<version>3.8.1</version>
<!-- 依賴類型,默認類型是jar。它通常表示依賴的文件的擴展名,但也有例外。一個類型可以被映射成另外一個擴展名或分類器。類型經(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)建兩個單獨的構(gòu)件成 JAR,一個使用Java 4編譯器,另一個使用Java 6編譯器,你就可以使用分類器來生成兩個單獨的JAR構(gòu)件。-->
<classifier></classifier>
<!--依賴范圍。在項目發(fā)布過程中,幫助決定哪些構(gòu)件被包括進來。欲知詳情請參考依賴機制。
- compile :默認范圍,用于編譯
- provided:類似于編譯,但支持你期待jdk或者容器提供,類似于classpath
- runtime: 在執(zhí)行時需要使用
- test: 用于test任務(wù)時使用
- system: 需要外在提供相應(yīng)的元素。通過systemPath來取得
- systemPath: 僅用于范圍為system。提供相應(yīng)的路徑
- optional: 當項目自身被依賴時,標注依賴是否傳遞。用于連續(xù)依賴時使用-->
<scope>test</scope>
<!--僅供system范圍使用。注意,不鼓勵使用這個元素,并且在新的版本中該元素可能被覆蓋掉。該元素為依賴規(guī)定了文件系統(tǒng)上的路徑。需要絕對路徑而不是相對路徑。推薦使用屬性匹配絕對路徑,例{java. home}。-->
<systemPath></systemPath>
<!--當計算傳遞依賴時, 從依賴構(gòu)件列表里,列出被排除的依賴構(gòu)件集。即告訴maven你只依賴指定的項目,不依賴項目的依賴。此元素主要用于解決版本沖突問題-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可選依賴,如果你在項目B中把C依賴聲明為可選,你就需要在依賴于B的項目(例如項目A)中顯式的引用對C的依賴??蛇x依賴阻斷依賴的傳遞性。-->
<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>
<!--當前代碼的標簽,在開發(fā)階段默認為HEAD-->
<tag/>
<!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。-->
<url>http://svn.baidu.com/banseon</url>
</scm>
<!--項目分發(fā)信息,在執(zhí)行mvn deploy后表示要發(fā)布的位置。有了這些信息就可以把網(wǎng)站部署到遠程服務(wù)器或者把構(gòu)件部署到遠程倉庫。-->
<distributionManagement>
<!--部署項目產(chǎn)生的構(gòu)件到遠程倉庫需要的信息-->
<repository>
<!--是分配給快照一個唯一的版本號(由時間戳和構(gòu)建流水號)?還是每次都使用相同的版本號?參見repositories/repository元素-->
<uniqueVersion/>
<id>banseon-maven2</id>
<name>banseon maven2</name>
<url>file://${basedir}/target/deploy</url>
<layout/>
</repository>
<!--構(gòu)件的快照部署到哪里?如果沒有配置該元素,默認部署到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>
<!--部署位置的唯一標識符,用來匹配站點和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)件在遠程倉庫的狀態(tài)。不得在本地項目中設(shè)置該元素,因為這是工具自動更新的。有效的值有:none(默認),converted(倉庫管理員從 Maven 1 POM轉(zhuǎn)換過來),partner(直接從伙伴Maven 2倉庫同步過來),deployed(從Maven 2實例部 署),verified(被核實時正確的和最終的)。-->
<status/>
</distributionManagement>
<build>
<!--當項目沒有規(guī)定目標(Maven2 叫做階段)時的默認值-->
<defaultGoal>install</defaultGoal>
<!--build目標文件的存放目錄,默認在 ${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>
<!-- 描述了資源的目標路徑。該路徑相對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>
<!--子項目可以引用的默認插件信息。該插件配置項直到被引用時才會被解析或綁定到生命周期。給定插件的任何本地配置都會覆蓋這里的配置-->
<pluginManagement>
<plugins>
...
</plugins>
</pluginManagement>
</build>
</project>