搭建springboot中有一个默认的pom文件,看到它里面的标签,有些不太熟悉,于是学习了下把找到的结果都记录下来。

1.parent

    <parent>
        <!--这是Spring Boot的父级依赖,这样当前的项目就是Spring Boot项目了。
            spring-boot-starter-parent 是一个特殊的starter,它用来提供相关的Maven默认依赖。
            使用它之后,常用的包依赖可以省去version标签。-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--springboot的版本号 -->
        <version>2.7.7-SNAPSHOT</version>
        <!--查找顺序:relativePath元素中的地址–本地仓库–远程仓库,
            设定一个空值将始终从仓库中获取,不从本地路径获取-->
        <relativePath/>
    </parent>

2.modelVersion

 <!-- 指定当前POM版本,对于maven2,3来说,只能4.0.0  -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 一般分为多个部分,类似于 xxx.xxx.xxx。第一部分为域,比如com、org、cn等,第二部分是公司名   -->
    <groupId>site.longkui</groupId>
    <!--    构件的唯一标识符号,-->
    <artifactId>app</artifactId>
    <!--    版本号-->
    <version>0.0.1-SNAPSHOT</version>
    <!--    这个可以理解为项目的名称,maven文档用-->
    <name>app</name>
    <!--  项目主页的URL, Maven产生的文档用  -->
    <url>http://www.baidu.com/banseon</url>
    <!--  项目的详细描述, Maven 产生的文档用   -->
    <description>Demo project for Spring Boot</description>

3.prerequisites


 <prerequisites>    
  <!--构建该项目或使用该插件所需要的Maven的最低版本-->    
    <maven/>    
 </prerequisites>    

4.properties

  <properties>
        <java.version>1.8</java.version>
    </properties>

通过<properties>元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用 ${属性名}的方式来引用该属性。比如下面这样:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <mysql.version>8.0.21</mysql.version>
  </properties>
  <dependencies>
 	 <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
  </dependencies>

5.issueManagement

一般不写

<!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira-->     
    <issueManagement>    
     <!--问题管理系统(例如jira)的名字,-->     
        <system>jira</system>     
        <!--该项目使用的问题管理系统的URL-->    
        <url>http://jira.baidu.com/banseon</url>     
    </issueManagement>    

6.developers

一般不写


    <!--项目开发者列表-->     
    <developers>     
     <!--某个项目开发者的信息-->    
        <developer>     
         <!--SCM里项目开发者的唯一标识符-->    
            <id>HELLO WORLD</id>     
            <!--项目开发者的全名-->    
            <name>banseon</name>     
            <!--项目开发者的email-->    
            <email>banseon@126.com</email>     
            <!--项目开发者的主页的URL-->    
            <url/>    
            <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色-->    
            <roles>     
                <role>Project Manager</role>     
                <role>Architect</role>     
            </roles>    
            <!--项目开发者所属组织-->    
            <organization>demo</organization>     
            <!--项目开发者所属组织的URL-->    
            <organizationUrl>http://hi.baidu.com/banseon</organizationUrl>     
            <!--项目开发者属性,如即时消息如何处理等-->    
            <properties>     
                <dept>No</dept>     
            </properties>    
            <!--项目开发者所在时区, -11到12范围内的整数。-->    
            <timezone>-5</timezone>     
        </developer>     
    </developers>   

7.dependencies

   <!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。-->     
    <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>  

8.build

build相关的配置一般有两种,一是全局配置(project build),第二是 (profile build)

8.1针对不同的profile配置

<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/maven-v4_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> 

8.2基本使用说明

8.2.1基本元素

<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

8.2.2Resources配置

          用于包含或者排除某些资源文件

<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
一个resources元素的列表。每一个都描述与项目关联的文件是什么和在哪里
2)targetPath
指定build后的resource存放的文件夹,默认是basedir。
通常被打包在jar中的resources的目标路径是META-INF
3)filtering
true/false,表示为这个resource,filter是否激活
4)directory
定义resource文件所在的文件夹,默认为${basedir}/src/main/resources
5)includes
指定哪些文件将被匹配,以*作为通配符
6)excludes
指定哪些文件将被忽略
7)testResources
定义和resource类似,只不过在test时使用

8.2.3plugins配置

             用于指定使用的插件

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

1)GAV
指定插件的标准坐标
2)extensions
是否加载plugin的extensions,默认为false
3)inherited
true/false,这个plugin是否应用到该pom的孩子pom,默认为true
4)configuration
配置该plugin期望得到的properties
5)dependencies
作为plugin的依赖
6)executions
plugin可以有多个目标,每一个目标都可以有一个分开的配置,可以将一个plugin绑定到不同的阶段
假如绑定antrun:run目标到verify阶段

<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:目标列表
phase:目标执行的阶段
inherit:子类pom是否继承
configuration:在指定目标下的配置

8.2.4pluginManagement配置

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> 

9.repository

配置Maven项目中需要使用的远程仓库,Maven项目的资源依赖关系等。其中pom是Project Object Model(项目对象模型)的简称。

表示从什么库地址可以下载`项目依赖`的库文件


<repository>
    <id>nexus</id><!--远程仓库唯一标识符 -->
    <name>Private Repository</name><!--描述 -->
    <url><!--远程仓库url --></url>
    <layout>default</layout>
    <releases>  
        <enabled>true</enabled>  
    </releases>  
    <snapshots>
       <enabled>true</enabled>
       <updatePolicy>always</updatePolicy>
    </snapshots>

id,库的ID
name,库的名称
url,库的URL
layout,在Maven 2/3中都是default,只有在Maven 1.x中才是legacy
releases,库中版本为releases的构件
snapshots,库中版本为snapshots的构件

enabled,是否支持更新
updatePolicy,构件更新的策略,可选值有daily, always, never, interval:X(其中的X是一个数字,表示间隔的时间,单位min),默认为daily
checksumPolicy,校验码异常的策略,可选值有ignore, fail, warn
layout,在Maven 2/3中都是default,只有在Maven 1.x中才是legacy

10.pluginRepositories

针对的是maven命令需要的插件依赖地址(比如clean、install都是maven的插件), 通过rpluginRepositories进行自定义配置。 如果只配置了repositories 则打包时候默认的插件依赖会从阿里云的仓库获取。

<pluginRepositories>
  <pluginRepository>
      <id>nexus</id>
      <name>Nexus</name>
      <url>http://127.1.19.1:8081/repository/ai-public/</url>
      <releases>
          <enabled>true</enabled>
          <updatePolicy>always</updatePolicy>  
          <checksumPolicy>warn</checksumPolicy>  
      </releases>
      <snapshots>
          <enabled>true</enabled>  
          <updatePolicy>always</updatePolicy>  
          <checksumPolicy>warn</checksumPolicy>  
      </snapshots>
  </pluginRepository>
</pluginRepositories>