备忘录2.Maven之pom.xml配置文件详解

setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件;而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。

基础配置

一个典型的pom.xml文件配置如下:

[html]view plaincopy

<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0modelVersion>

<groupId>com.winner.tradegroupId>

<artifactId>trade-coreartifactId>

<version>1.0.0-SNAPSHOTversion>

<packaging>jarpackaging>

<classifier>...classifier>

<dependencies>

<dependency>

<groupId>com.winner.tradegroupId>

<artifactId>trade-testartifactId>

<version>1.0.0-SNAPSHOTversion>

<scope>testscope>

<optional>falseoptional>

<exclusions>

<exclusion>

<groupId>org.slf4jgroupId>

<artifactId>slf4j-apiartifactId>

exclusion>

exclusions>

dependency>

dependencies>

<properties>

<file.encoding>UTF-8file.encoding>

<java.source.version>1.5java.source.version>

<java.target.version>1.5java.target.version>

properties>

    ...  

project>

一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。

这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。

classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码) 这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。

classifier的用途在于:

1. maven download  javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件

2. 引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套:

引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:

[html]view plaincopy

<dependency>

<groupId>net.sf.json-libgroupId>

<artifactId>json-libartifactId>

<version>2.4version>

<classifier>jdk15classifier>

dependency>

构建配置

[html]view plaincopy

<build>

<finalName>myPorjectNamefinalName>

<directory>${basedir}/targetdirectory>

<defaultGoal>installdefaultGoal>

<filters>

<filter>../filter.propertiesfilter>

filters>

<resources>

<resource>

<targetPath>resourcestargetPath>

<filtering>truefiltering>

<directory>src/main/resourcesdirectory>

<includes>

<include>**/*.propertiesinclude>

<include>**/*.xmlinclude>

includes>

<excludes>

<exclude>jdbc.propertiesexclude>

excludes>

resource>

resources>

<testResources>

<testResource>

<targetPath/>

<filtering/>

<directory/>

<includes/>

<excludes/>

testResource>

testResources>

<sourceDirectory>${basedir}\src\main\javasourceDirectory>

<scriptSourceDirectory>${basedir}\src\main\scripts  

scriptSourceDirectory>

<testSourceDirectory>${basedir}\src\test\javatestSourceDirectory>

<outputDirectory>${basedir}\target\classesoutputDirectory>

<testOutputDirectory>${basedir}\target\test-classes  

testOutputDirectory>

<extensions>

<extension>

<groupId>org.apache.maven.wagongroupId>

<artifactId>wagon-sshartifactId>

<version>2.8version>

extension>

extensions>

<plugins>

<plugin>

<groupId>groupId>

<artifactId>maven-assembly-pluginartifactId>

<version>2.5.5version>

<executions>

<execution>

<id>assemblyid>

<phase>packagephase>

<goals>

<goal>singlegoal>

goals>

<inherited>falseinherited>

execution>

executions>

<configuration>

<finalName>${finalName}finalName>

<appendAssemblyId>falseappendAssemblyId>

<descriptor>assembly.xmldescriptor>

configuration>

<extensions>falseextensions>

<dependencies>

<dependency>...dependency>

dependencies>

<inherited>trueinherited>

plugin>

plugins>

<pluginManagement>

<plugins>...plugins>

pluginManagement>

build>

pom里面的仓库与setting.xml里的仓库功能是一样的。主要的区别在于,pom里的仓库是个性化的。比如一家大公司里的setting文件是公用的,所有项目都用一个setting文件,但各个子项目却会引用不同的第三方库,所以就需要在pom里设置自己需要的仓库地址。

分发配置

[html]view plaincopy

<distributionManagement>

<repository>

<uniqueVersion>trueuniqueVersion>

<id> repo-id id>

<name> repo-namename>

<url>file://${basedir}/target/deploy url>

<layout/>

repository>

<snapshotRepository>

<uniqueVersion/>

<id/>

<name/>

<url/>

<layout/>

snapshotRepository>

<site>

<id> site-id id>

<name> site-namename>

<url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web url>

site>

<downloadUrl/>

<relocation>

<groupId/>

<artifactId/>

<version/>

<message/>

relocation>

<status/>

distributionManagement>

仓库配置

[html]view plaincopy

<repositories>

<repository>

<releases>

<enabled/>

<updatePolicy/>

<checksumPolicy/>

releases>

<snapshots>

<enabled/>

<updatePolicy/>

<checksumPolicy/>

snapshots>

<id> repo-id id>

<name> repo-namename>

<url>http://192.168.1.169:9999/repository/ url>

<layout> defaultlayout>

repository>

repositories>

<pluginRepositories>

<pluginRepository/>

pluginRepositories>

profile配置

[html]view plaincopy

<profiles>

<profile>

<activation>

<activeByDefault>falseactiveByDefault>

<jdk>1.7jdk>

<os>

<name>Windows XPname>

<family>Windowsfamily>

<arch>x86arch>

<version>5.1.2600version>

os>

<property>

<name>mavenVersionname>

<value>2.0.3value>

property>

<file>

<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/exists>

<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>

profile配置项在setting.xml中也有,是pom.xml中profile元素的裁剪版本,包含了id,activation, repositories, pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为setting.xml只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。

pom.xml中的profile可以看做pom.xml的副本,拥有与pom.xml相同的子元素与配置方法。它包含可选的activation(profile的触发器)和一系列的changes。例如test过程可能会指向不同的数据库(相对最终的deployment)或者不同的dependencies或者不同的repositories,并且是根据不同的JDK来改变的。只需要其中一个成立就可以激活profile,如果第一个条件满足了,那么后面就不会在进行匹配。

报表配置

[html]view plaincopy

<reporting>

<excludeDefaults/>

<outputDirectory/>

<plugins>

<plugin>

<groupId/>

<artifactId/>

<version/>

<inherited/>

<configuration>

<links>

<link>http://java.sun.com/j2se/1.5.0/docs/api/link>

links>

configuration>

<reportSets>

<reportSet>

<id>sunlinkid>

<configuration/>

<inherited/>

<reports>

<report>javadocreport>

reports>

reportSet>

reportSets>

plugin>

plugins>

reporting>

环境配置

[html]view plaincopy

<issueManagement>

<system> jira system>

<url> http://jira.clf.com/url>

issueManagement>

<ciManagement>

<system/>

<url/>

<notifiers>

<notifier>

<type/>

<sendOnError/>

<sendOnFailure/>

<sendOnSuccess/>

<sendOnWarning/>

<address/>

<configuration/>

notifier>

notifiers>

ciManagement>

项目信息配置

[html]view plaincopy

<name>banseon-maven name>

<url>http://www.clf.com/ url>

<description>A maven project to study maven. description>

<prerequisites>

<maven/>

prerequisites>

<inceptionYear/>

<mailingLists>

<mailingList>

<name> Demo name>

<post> clf@126.compost>

<subscribe> clf@126.comsubscribe>

<unsubscribe> clf@126.comunsubscribe>

<archive> http:/hi.clf.com/archive>

mailingList>

mailingLists>

<developers>

<developer>

<id> HELLO WORLD id>

<name> banseon name>

<email> banseon@126.comemail>

<url/>

<roles>

<role> Project Managerrole>

<role>Architect role>

roles>

<organization> demoorganization>

<organizationUrl>http://hi.clf.com/ organizationUrl>

<properties>

<dept> No dept>

properties>

<timezone> -5timezone>

developer>

developers>

<contributors>

<contributor>

<name/>

<email/>

<url/>

<organization/>

<organizationUrl/>

<roles/>

<timezone/>

<properties/>

contributor>

contributors>

<licenses>

<license>

<name> Apache 2 name>

<url>http://www.clf.com/LICENSE-2.0.txt url>

<distribution> repodistribution>

<comments> Abusiness-friendly OSS license comments>

license>

licenses>

<scm>

<connection>scm:svn:http://svn.baidu.com/banseon/maven/connection>

<developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/  

developerConnection>

<tag/>

<url> http://svn.baidu.com/banseonurl>

scm>

<organization>

<name> demo name>

<url> http://www.clf.com/url>

organization>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎注:本文转载自:htt...
    chloneda阅读 799评论 0 0
  • maven的pom.xml文件配置详解 setting.xml主要用于配置maven的运行环境等一系列通用的属性,...
    ProZoom阅读 1,695评论 0 6
  • Maven概述 Maven定义Maven是一个项目管理和整合,统一管理jar包的工具;Maven为开发者提供了一套...
    THQ的简书阅读 797评论 0 0
  • 简介 什么是 pom? POM 是 Project Object Model 的缩写,即项目对象模型。 pom.x...
    4ea0af17fd67阅读 455评论 0 1
  • 暑假的假期生活马上就要结束了,掐指一算也就剩下仅仅的14天左右,虽说,老师给女儿布置大部分作业都已完成,但...
    尚欣欣阅读 396评论 0 2