转载自  Maven的pom.xml文件详解------Build Settings

根据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.0http://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>

BaseBuild元素集合

basic elements

<build><defaultGoal>install</defaultGoal><directory>${basedir}/target</directory><finalName>${artifactId}-${version}</finalName><filters><filter>filters/filter1.properties</filter></filters>...
</build>

1、defaultGoal:执行build任务时,如果没有指定目标,将使用的默认值,如:在命令行中执行mvn,则相当于执行mvn install; 
2、directory:build目标文件的存放目录,默认在${basedir}/target目录; 
3、finalName:build目标文件的文件名,默认情况下为${artifactId}-${version}; 
4、filter:定义*.properties文件,包含一个properties列表,该列表会应用的支持filter的resources中。也就是说,定义在filter的文件中的"name=value"值对会在build时代替${name}值应用到resources中。Maven的默认filter文件夹是${basedir}/src/main/filters/。

resources

build的另一个特征是指定你的项目中resources的位置。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>

1、resources:一个resource元素的列表,每一个都描述与项目关联的文件是什么和在哪里; 
2、targetPath:指定build后的resource存放的文件夹。该路径默认是basedir。通常被打包在JAR中的resources的目标路径为META-INF; 
3、filtering:true/false,表示为这个resource,filter是否激活。 
4、directory:定义resource所在的文件夹,默认为${basedir}/src/main/resources; 
5、includes:指定作为resource的文件的匹配模式,用*作为通配符; 
6、excludes:指定哪些文件被忽略,如果一个文件同时符合includes和excludes,则excludes生效; 
7、testResources:定义和resource类似,但只在test时使用,默认的test resource文件夹路径是${basedir}/src/test/resources,test resource不被部署。

Plugins

<build>...<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.0</version><extensions>false</extensions><inherited>true</inherited><configuration><classifier>test</classifier></configuration><dependencies>...</dependencies><executions>...</executions></plugin></plugins>
</build>

除了groupId:artifactId:version标准坐标,plugin还需要如下属性: 
1、extensions:true/false,是否加载plugin的extensions,默认为false; 
2、inherited:true/false,这个plugin是否应用到该POM的孩子POM,默认true; 
3、configuration:配置该plugin期望得到的properies,如上面的例子,我们为maven-jar-plugin的Mojo设置了classifier属性;

如果你的POM有一个parent,它可以从parent的build/plugins或者pluginManagement集成plugin配置。

为了阐述继承后的关系,考虑如果parent POM中存在如下plugin:

<plugin><groupId>my.group</groupId><artifactId>my-plugin</artifactId><configuration><items><item>parent-1</item><item>parent-2</item></items><properties><parentKey>parent</parentKey></properties></configuration>
</plugin>

然后在继承的孩子POM中做如下配置:

<plugin><groupId>my.group</groupId><artifactId>my-plugin</artifactId><configuration><items><item>child-1</item></items><properties><childKey>child</childKey></properties></configuration>
</plugin>

这样孩子POM和parent POM中都存在groupId为my.group的plugin,Maven默认的行为将是根据属性名称将两个plugin的configuration的内容进行合并。如果孩子POM中有一个属性,则该属性是有效的,如果孩子POM中没有一个属性,但parent POM中存在,则parent中的属性是有效的。

根据这些规则,上面的例子在Maven中将得到:

<plugin><groupId>my.group</groupId><artifactId>my-plugin</artifactId><configuration><items><item>child-1</item></items><properties><childKey>child</childKey><parentKey>parent</parentKey></properties></configuration>
</plugin>

通过在configuration元素中增加combine.children和combine.self属性,孩子POM可以控制Maven怎么合并plugin的configuration。

假定这儿是孩子POM的configuration:

<configuration><items combine.children="append"><!-- combine.children="merge" is the default --><item>child-1</item></items><properties combine.self="override"><!-- combine.self="merge" is the default --><childKey>child</childKey></properties>
</configuration>

则,现在合并后的效果如下:

<configuration><items combine.children="append"><item>parent-1</item><item>parent-2</item><item>child-1</item></items><properties combine.self="override"><childKey>child</childKey></properties>
</configuration>

combine.children="append"表示父POM和子POM的属性合并起来;

combine.self="override"表示子POM的属性完全覆盖父POM的。

4、dependencies:同base build中的dependencies有同样的结构和功能,但这里是作为plugin的依赖,而不是项目的依赖。
5、executions:plugin可以有多个目标,每一个目标都可以有一个分开的配置,甚至可以绑定一个plugin的目标到一个不同的阶段。executions配置一个plugin的目标的execution。

假定一项绑定antrun:run目标到verify阶段,我们希望任务响应build文件夹,同时避免传递配置到他的孩子POM。你将得到一个execution:

<build><plugins><plugin><artifactId>maven-antrun-plugin</artifactId><version>1.1</version><executions><execution><id>echodir</id><goals><goal>run</goal></goals><phase>verify</phase><inherited>false</inherited><configuration><tasks><echo>Build Dir: ${project.build.directory}</echo></tasks></configuration></execution></executions></plugin></plugins>
</build>

id:标识,用于和其他execution区分。当这个阶段执行时,它将以这个形式展示:[plugin:goal execution: id]。在这里为: [antrun:run execution: echodir];

goals:一个plugin的execution的目标列表;

phase:目标执行的阶段,具体值看Maven的生命周期列表;

inherited:是否继承;

configuration:在指定的目标下的配置。

Plugin Management

pluginManagement的元素的配置和plugins的配置是一样的,只是这里的配置只是用于集成,在孩子POM中指定使用。例如,在父POM中做如下配置:

<build>...<pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.2</version><executions><execution><id>pre-process-classes</id><phase>compile</phase><goals><goal>jar</goal></goals><configuration><classifier>pre-process</classifier></configuration></execution></executions></plugin></plugins></pluginManagement>...
</build>

则在孩子POM中,我们只需要配置:

<build>...<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId></plugin></plugins>...
</build>

这样就可以大大的简化孩子POM中的配置。

Reporting

Reporting包含的属性对应到site阶段(见Maven生命周期)。特定的Maven插件能产生定义和配置在reporting元素下的报告,例如:产生Javadoc报告。

<reporting><outputDirectory>${basedir}/target/site</outputDirectory><plugins><plugin><artifactId>maven-project-info-reports-plugin</artifactId><version>2.0.1</version><reportSets><reportSet></reportSet></reportSets></plugin></plugins>
</reporting>

对于reportSets:

<reportSets><reportSet><id>sunlink</id><reports><report>javadoc</report></reports><inherited>true</inherited><configuration><links><link>http://java.sun.com/j2se/1.5.0/docs/api/</link></links></configuration></reportSet>
</reportSets>

Maven的pom.xml文件详解------Build Settings相关推荐

  1. Maven的pom.xml文件详解------Environment Settings

    转载自  Maven的pom.xml文件详解------Environment Settings Issue Management 使用的缺陷跟踪系统(Bugzilla,TestTrack,Clear ...

  2. Maven的pom.xml文件详解------The Basics

    转载自  Maven的pom.xml文件详解------The Basics Maven坐标 GroupId.artifactId和version构成了Maven的坐标(groupId和version ...

  3. maven系列一:pom.xml文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. Maven学习总结(十一)——Maven项目对象模型pom.xml文件详解

    2019独角兽企业重金招聘Python工程师标准>>> <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  5. pom.xml文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. Maven之pom.xml配置文件详解

    一.什么是pom pom代表项目对象模型,它是Maven中工作的基本组成单位.它是一个XML文件,始终保存在项目的基本目录中的pom.xml文件中.pom包含的对象是使用maven来构建的,pom.x ...

  7. 史上最全的 pom.xml 文件详解

    一.什么是POM Project Object Model,项目对象模型.通过xml可扩展标记语言(EXtensible Markup Language)格式保存的pom.xml文件.作用类似ant的 ...

  8. 二:Maven中pom.xml元素详解

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628201.html  一个pom.xml中包含了许多标签,各个标签是对项目生命周期.依赖管理的配置.常用的主 ...

  9. pom文件找不到子项目_java,eclipse_eclipse中maven项目pom.xml文件找不到parent要怎么解决?,java,eclipse,maven - phpStudy...

    eclipse中maven项目pom.xml文件找不到parent要怎么解决? 在maven项目中方pom.xml文件找不到parent,maven clean报错如下: [ERROR] [ERROR ...

最新文章

  1. 【转】Android下编译jni库的二种方法(含示例) -- 不错
  2. MD5算法 —— C语言实现(字符串的加密)
  3. CF280D-k-Maximum Subsequence Sum【模拟费用流,线段树】
  4. 前端学习(670):分支流程控制if
  5. 饿了么监控系统 EMonitor 与美团点评 CAT 的对比
  6. Bootstrap 教程 之 Less 入门文档
  7. 基于logistic模型,GM模型和Leslie模型全国人口预测
  8. aodv-uu 源码解读
  9. 经典日内策略分析(收藏版)Dual Thrust、ATR、R-Breaker、菲阿里四价
  10. openwrt编译smartdns_LEDE/OpenWRT 部署SmartDNS
  11. html字体样式不显示不出来,css怎么设置不显示文字
  12. 到了2020年,技术水平到底需要达到怎样的程度才能成为顶级的阿里P8架构师
  13. SQL语句按照姓名首字母排序
  14. dell服务器售后电话(dell存储售后电话)
  15. element表单校验
  16. 睿普康 以太网接口PHY芯片主要替换瑞昱的pin对pin芯片
  17. java 数字和字母_java-如何在字母和数字之间(或数字和字母之间)分割字符串?...
  18. 合伙人股权设计的9点常识
  19. 【小白福利—初级DBA入门必看】MySQL常用工具介绍(十)——客户端工具MySQL_slap
  20. python精确有理数实验_python之有理数运算Rational类

热门文章

  1. java 毕向东 内部类_java基础内部类(毕向东老师)
  2. android虚线边框_Android实现代码画虚线边框背景效果
  3. 初探react,用react实现一个todoList功能
  4. AcWing 126. 最大的和
  5. C++string容器-构造函数
  6. 配合理lcd的c语言小游戏,C语言源程序LCD.doc
  7. LeetCode动态规划 斐波那契数
  8. 平衡二叉树AVL详解
  9. P4211 [LNOI2014]LCA(离线 + 在线 做法)
  10. Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数