maven是一个软件工程(Software Project)管理工具。 对于maven来说,一个软件工程的唯一标识(也叫maven坐标)是由groupId(开发者)、artifactId(开发的产品)、version(产品版本) 共同决定的。每个maven管理的工程都有一个打包类型,可以是jar, war, ear 或 pom。打包类型决定了工程最终产物的类型。 其中pom类型用于构件多模块工程。常见的pom标签如下:


<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。-->
      
<parent>
      <!--被继承的父项目的构件标识符-->
      <artifactId/>
      <!--被继承的父项目的全球唯一标识符-->
      <groupId/>
      <!--被继承的父项目的版本-->
      <version/>
      <!--父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->
      <relativePath/>
  </parent>
 


 
<!--pom文件里多洗使用到的值定义成变量--><properties>
<spring.version>3.0.9</spring.version>
</properties>
 



  <!--引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置--> 

  <buid> 

  <!--使用的插件列表 。--> 

    <plugins> 

     <!--plugin元素包含描述插件所需要的信息。--> 

     <plugin> 

      <!--插件在仓库里的group ID--> 

      <groupId/> 

      <!--插件在仓库里的artifact ID--> 

      <artifactId/> 

      <!--被使用的插件的版本(或版本范围)--> 

      <version/> 

      <!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。--> 

      <extensions/> 

      <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。--> 

      <executions> 

       <!--execution元素包含了插件执行需要的信息--> 

       <execution> 

        <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标--> 

        <id/> 

        <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段--> 

        <phase/> 

        <!--配置的执行目标--> 

        <goals/> 

        <!--配置是否被传播到子POM--> 

        <inherited/> 

        <!--作为DOM对象的配置--> 

        <configuration/> 

       </execution> 

      </executions> 

      <!--项目引入插件所需要的额外依赖--> 

      <dependencies> 

       <!--参见dependencies/dependency元素--> 

       <dependency> 

        ...... 

       </dependency> 

      </dependencies>      

      <!--任何配置是否被传播到子项目--> 

      <inherited/> 

      <!--作为DOM对象的配置--> 

      <configuration/> 

     </plugin> 

    </plugins> 

  </buid> 



   
<!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。-->  
     <dependencies>  
         <dependency>
    <!--依赖的group ID-->
             <groupId>org.apache.maven</groupId>  
             <!--依赖的artifact ID-->
             <artifactId>maven-artifact</artifactId>  
             <!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。-->
             <version>3.8.1</version>  
             <!--依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在plugin里定义新的类型。所以前面的类型的例子不完整。-->
             <type>jar</type>
             <!--依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。-->
             <classifier></classifier>
             <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 
                 - compile :默认范围,用于编译   
                 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath   
                 - runtime: 在执行时需要使用   
                 - test:    用于test任务时使用   
                 - system: 需要外在提供相应的元素。通过systemPath来取得   
                 - systemPath: 仅用于范围为system。提供相应的路径   
                 - optional:   当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用-->  
             <scope>test</scope>    
             <!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。--> 
             <systemPath></systemPath>  
             <!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题--> 
             <exclusions>
              <exclusion>  
                     <artifactId>spring-core</artifactId>  
                     <groupId>org.springframework</groupId>  
                 </exclusion>  
             </exclusions>    
             <!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。-->  
             <optional>true</optional>
         </dependency>
     </dependencies>



所有标签:

<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。-->
    <parent>
     <!--被继承的父项目的构件标识符-->
     <artifactId/>
     <!--被继承的父项目的全球唯一标识符-->
     <groupId/>
     <!--被继承的父项目的版本-->
     <version/>
     <!--父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->
     <relativePath/>
 </parent>

 
 
 <!--引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置-->
 <buid>
 <!--使用的插件列表 。-->
   <plugins>
    <!--plugin元素包含描述插件所需要的信息。-->
    <plugin>
     <!--插件在仓库里的group ID-->
     <groupId/>
     <!--插件在仓库里的artifact ID-->
     <artifactId/>
     <!--被使用的插件的版本(或版本范围)-->
     <version/>
     <!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。-->
     <extensions/>
     <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。-->
     <executions>
      <!--execution元素包含了插件执行需要的信息-->
      <execution>
       <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标-->
       <id/>
       <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段-->
       <phase/>
       <!--配置的执行目标-->
       <goals/>
       <!--配置是否被传播到子POM-->
       <inherited/>
       <!--作为DOM对象的配置-->
       <configuration/>
      </execution>
     </executions>
     <!--项目引入插件所需要的额外依赖-->
     <dependencies>
      <!--参见dependencies/dependency元素-->
      <dependency>
       ......
      </dependency>
     </dependencies>     
     <!--任何配置是否被传播到子项目-->
     <inherited/>
     <!--作为DOM对象的配置-->
     <configuration/>
    </plugin>
   </plugins>
 </buid>

 <!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。-->  
    <dependencies>  
        <dependency>
   <!--依赖的group ID-->
            <groupId>org.apache.maven</groupId>  
            <!--依赖的artifact ID-->
            <artifactId>maven-artifact</artifactId>  
            <!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。-->
            <version>3.8.1</version>  
            <!--依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在plugin里定义新的类型。所以前面的类型的例子不完整。-->
            <type>jar</type>
            <!--依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。-->
            <classifier></classifier>
            <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 
                - compile :默认范围,用于编译   
                - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath   
                - runtime: 在执行时需要使用   
                - test:    用于test任务时使用   
                - system: 需要外在提供相应的元素。通过systemPath来取得   
                - systemPath: 仅用于范围为system。提供相应的路径   
                - optional:   当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用-->  
            <scope>test</scope>    
            <!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。--> 
            <systemPath></systemPath>  
            <!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题--> 
            <exclusions>
             <exclusion>  
                    <artifactId>spring-core</artifactId>  
                    <groupId>org.springframework</groupId>  
                </exclusion>  
            </exclusions>    
            <!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。-->  
            <optional>true</optional>
        </dependency>
    </dependencies>