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

根据POM 4.0.0 XSD,build元素概念性的划分为两个部分:BaseBuild(包含poject build和profile build的公共部分,见下)和poject build包含的一些高级特性。

[html] view plain copy

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. ...
  6. <!-- "Project Build" contains more elements than just the BaseBuild set -->
  7. <build>...</build>
  8. <profiles>
  9. <profile>
  10. <!-- "Profile Build" contains a subset of "Project Build"s elements -->
  11. <build>...</build>
  12. </profile>
  13. </profiles>
  14. </project>

BaseBuild元素集合

basic elements

[html] view plain copy

  1. <build>
  2. <defaultGoal>install</defaultGoal>
  3. <directory>${basedir}/target</directory>
  4. <finalName>${artifactId}-${version}</finalName>
  5. <filters>
  6. <filter>filters/filter1.properties</filter>
  7. </filters>
  8. ...
  9. </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(通常)不是代码,他们不被编译,但是被绑定在你的项目或者用于其它什么原因,例如代码生成。

[html] view plain copy

  1. <build>
  2. ...
  3. <resources>
  4. <resource>
  5. <targetPath>META-INF/plexus</targetPath>
  6. <filtering>false</filtering>
  7. <directory>${basedir}/src/main/plexus</directory>
  8. <includes>
  9. <include>configuration.xml</include>
  10. </includes>
  11. <excludes>
  12. <exclude>**/*.properties</exclude>
  13. </excludes>
  14. </resource>
  15. </resources>
  16. <testResources>
  17. ...
  18. </testResources>
  19. ...
  20. </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

[html] view plain copy

  1. <build>
  2. ...
  3. <plugins>
  4. <plugin>
  5. <groupId>org.apache.maven.plugins</groupId>
  6. <artifactId>maven-jar-plugin</artifactId>
  7. <version>2.0</version>
  8. <extensions>false</extensions>
  9. <inherited>true</inherited>
  10. <configuration>
  11. <classifier>test</classifier>
  12. </configuration>
  13. <dependencies>...</dependencies>
  14. <executions>...</executions>
  15. </plugin>
  16. </plugins>
  17. </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:

[html] view plain copy

  1. <plugin>
  2. <groupId>my.group</groupId>
  3. <artifactId>my-plugin</artifactId>
  4. <configuration>
  5. <items>
  6. <item>parent-1</item>
  7. <item>parent-2</item>
  8. </items>
  9. <properties>
  10. <parentKey>parent</parentKey>
  11. </properties>
  12. </configuration>
  13. </plugin>

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

[html] view plain copy

  1. <pre name="code" class="html"><plugin>
  2. <groupId>my.group</groupId>
  3. <artifactId>my-plugin</artifactId>
  4. <configuration>
  5. <items>
  6. <item>child-1</item>
  7. </items>
  8. <properties>
  9. <childKey>child</childKey>
  10. </properties>
  11. </configuration>
  12. </plugin></pre>

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

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

[html] view plain copy

  1. <pre name="code" class="html"><plugin>
  2. <groupId>my.group</groupId>
  3. <artifactId>my-plugin</artifactId>
  4. <configuration>
  5. <items>
  6. <item>child-1</item>
  7. </items>
  8. <properties>
  9. <childKey>child</childKey>
  10. <parentKey>parent</parentKey>
  11. </properties>
  12. </configuration>
  13. </plugin></pre>

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

假定这儿是孩子POM的configuration:

[html] view plain copy

  1. <pre name="code" class="html"><configuration>
  2. <items combine.children="append">
  3. <!-- combine.children="merge" is the default -->
  4. <item>child-1</item>
  5. </items>
  6. <properties combine.self="override">
  7. <!-- combine.self="merge" is the default -->
  8. <childKey>child</childKey>
  9. </properties>
  10. </configuration></pre>

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

[html] view plain copy

  1. <pre name="code" class="html"><configuration>
  2. <items combine.children="append">
  3. <item>parent-1</item>
  4. <item>parent-2</item>
  5. <item>child-1</item>
  6. </items>
  7. <properties combine.self="override">
  8. <childKey>child</childKey>
  9. </properties>
  10. </configuration></pre>

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:

[html] view plain copy

  1. <pre name="code" class="html"><build>
  2. <plugins>
  3. <plugin>
  4. <artifactId>maven-antrun-plugin</artifactId>
  5. <version>1.1</version>
  6. <executions>
  7. <execution>
  8. <id>echodir</id>
  9. <goals>
  10. <goal>run</goal>
  11. </goals>
  12. <phase>verify</phase>
  13. <inherited>false</inherited>
  14. <configuration>
  15. <tasks>
  16. <echo>Build Dir: ${project.build.directory}</echo>
  17. </tasks>
  18. </configuration>
  19. </execution>
  20. </executions>
  21. </plugin>
  22. </plugins>
  23. </build></pre>

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

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

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

inherited:是否继承;

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

Plugin Management

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

[html] view plain copy

  1. <build>
  2. ...
  3. <pluginManagement>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-jar-plugin</artifactId>
  8. <version>2.2</version>
  9. <executions>
  10. <execution>
  11. <id>pre-process-classes</id>
  12. <phase>compile</phase>
  13. <goals>
  14. <goal>jar</goal>
  15. </goals>
  16. <configuration>
  17. <classifier>pre-process</classifier>
  18. </configuration>
  19. </execution>
  20. </executions>
  21. </plugin>
  22. </plugins>
  23. </pluginManagement>
  24. ...
  25. </build>

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

[html] view plain copy

  1. <build>
  2. ...
  3. <plugins>
  4. <plugin>
  5. <groupId>org.apache.maven.plugins</groupId>
  6. <artifactId>maven-jar-plugin</artifactId>
  7. </plugin>
  8. </plugins>
  9. ...
  10. </build>

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

Reporting

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

[html] view plain copy

  1. <reporting>
  2. <outputDirectory>${basedir}/target/site</outputDirectory>
  3. <plugins>
  4. <plugin>
  5. <artifactId>maven-project-info-reports-plugin</artifactId>
  6. <version>2.0.1</version>
  7. <reportSets>
  8. <reportSet></reportSet>
  9. </reportSets>
  10. </plugin>
  11. </plugins>
  12. </reporting>

对于reportSets:

[html] view plain copy

    1. <reportSets>
    2. <reportSet>
    3. <id>sunlink</id>
    4. <reports>
    5. <report>javadoc</report>
    6. </reports>
    7. <inherited>true</inherited>
    8. <configuration>
    9. <links>
    10. <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
    11. </links>
    12. </configuration>
    13. </reportSet>
    14. </reportSets>
时间: 2024-10-06 16:46:25

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

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

史上最全的maven的pom.xml文件详解 http://www.cnblogs.com/hafiz/p/5360195.html <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 h

Maven的pom.xml文件详解

转自:http://www.cnblogs.com/hafiz/p/5360195.html <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.o

Maven pom.xml文件详解

Maven pom.xml文件详解 一.简介 POM全称是Project Object Model,即项目对象模型. pom.xml是maven的项目描述文件,它类似与antx的project.xml文件. pom.xml文件以xml的 形式描述项目的信息,包括项目名称.版本.项目id.项目的依赖关系.编译环境.持续集成.项目团队.贡献管理.生成报表等等.总之,它包含了所有的项目 信息. <project xmlns="http://maven.apache.org/POM/4.0.0&q

Maven的pom.xml配置文件详解

1 Maven的pom.xml配置文件详解 2 Maven简述 3 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 4 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目.由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长

Maven之pom.xml配置文件详解

Maven之pom.xml配置文件详解 2019-06-05 一.什么是pom? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.作用类似ant的build.xml文件,功能更强大.该文件用于管理:源代码.配置文件.开发者的信息和角色.问题追踪系统.组织信息.项目授权.项目的url.项目的依赖关系等等.事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件.

maven pom.xml 文件详解

参考资料: http://blog.csdn.net/uohzoaix/article/details/7035307 http://www.cnblogs.com/qq78292959/p/3711501.html skeleton <project> <modelVersion>4.0.0</modelVersion> <groupId>...</groupId> <artifactId>...</artifactId>

Maven笔记 pom.xml配置详解

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

Maven系列--pom.xml 配置详解

1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4 <!--父项

pom.xml文件详解

原文:https://www.cnblogs.com/hafiz/p/5360195.html <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.