zoukankan      html  css  js  c++  java
  • Maven的pom.xml文件详解------Build Settings

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

    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.   
    9.   
    10.     <profiles>  
    11.         <profile>  
    12.             <!-- "Profile Build" contains a subset of "Project Build"s elements -->  
    13.             <build>...</build>  
    14.         </profile>  
    15.     </profiles>  
    16. </project>  

    BaseBuild元素集合

    basic elements

    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(通常)不是代码,他们不被编译,但是被绑定在你的项目或者用于其它什么原因,例如代码生成。

    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

    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:

    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中做如下配置:

    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中将得到:

    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:

    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>  

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

    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:

    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中做如下配置:

    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中,我们只需要配置:

    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报告。

    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:

      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
  • 相关阅读:
    春招已近,这份GitHub万星的ML算法面试大全请收下
    [资源推荐] 必须收藏的两个查找论文和代码实现的网站!
    windows下安装pycocotools,亲测有效!
    GAN原理
    2018-07-02
    虚函数和纯虚函数
    友元
    string字符串
    实参和形参
    C/C++学习笔记汇总
  • 原文地址:https://www.cnblogs.com/avivahe/p/5820288.html
Copyright © 2011-2022 走看看