简介
说明
本文介绍maven的pom.xml的结构及常用标签的使用。详细讲解的标签包括:parent,relativePath,modules,repositories,profiles,build等。
官网
pom.xml - maven
简介
对于Idea来说,最后maven的插件总会覆盖掉生成的pom.xml文件,这时可以使用ctrl+z来取消。
pom.xml构成
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>
    <!-- 基础设置 -->
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>...</packaging>
    <name>...</name>
    <description>...</description>
    <url>...</url>
    <dependencies>...</dependencies>
    <parent>...</parent>
    <dependencyManagement>...</dependencyManagement>
    <modules>...</modules>
    <properties>...</properties>
    <!--构建设置 -->
    <build>...</build>
    <reporting>...</reporting>
    <!-- 更多项目信息 -->
    <inceptionYear>...</inceptionYear>
    <licenses>...</licenses>
    <organization>...</organization>
    <developers>...</developers>
    <contributors>...</contributors>
    <!-- 环境设置-->
    <issueManagement>...</issueManagement>
    <ciManagement>...</ciManagement>
    <mailingLists>...</mailingLists>
    <scm>...</scm>
    <prerequisites>...</prerequisites>
    <repositories>...</repositories>
    <pluginRepositories>...</pluginRepositories>
    <distributionManagement>...</distributionManagement>
    <profiles>...</profiles>
</project>parent
简介
其他网址
Maven 的聚合(多模块)和 Parent 继承_偶尔记一下 - mybatis.io-
实例项目
Idea项目系列--多模块项目(淘淘商城)_开发工具_feiying0canglang的博客-
Dubbo系列--快速入门_feiying0canglang的博客
简介
parent作用:继承。继承可以使得子POM可以获得 parent 中的各项配置,可以对子pom进行统一的配置和依赖管理。比如:parent指定的项目里的pom.xml引入了abc依赖,则子项目无需引入abc依赖可以直接使用(如果子项目也引入了abc依赖,则以子项目引入的版本为准)。
以下父POM元素不能被子POM继承:
- artifactId
 - name
 - prerequisites
 
以下父POM元素能被子POM继承:
- groupId
 - version
 - description
 - url
 - inceptionYear
 - organization
 - licenses
 - developers
 - contributors
 - mailingLists
 - scm
 - issueManagement
 - ciManagement
 - properties
 - dependencyManagement
 - dependencies
 - repositories
 - pluginRepositories
 - build
 
- plugin executions with matching ids
 - plugin configuration
 - etc.
 
- reporting
 - profiles
 
用法
<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.abc</groupId>
        <artifactId>my-parent</artifactId>
        <version>2.0</version>
        <relativePath>../my-parent</relativePath>
        <!---> relativePath元素不是必须的,指定后会优先从指定的位置查找父pom。 <--->
    </parent>
    <artifactId>my-project</artifactId>
</project>注意:parent项目的打包方式必须是pom,本处的my-parent就要这么指定:<packaging>pom</packaging>
项目结构
以下两种结构都需要parent节点。


pom.xml示例
此例子中,“spring-boot-starter-parent”会为开发者提供常用jar的版本管理。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>不用parent
并非所有的公司都需要这个parent,有的时候,公司会自定义parent,我们的SpringBoot项目只能继承一个parent,继承了公司内部的parent就不能再继承这个了,这个时候怎么办呢?
一个简单的办法就是我们自行定义dependencyManagement节点,然后在里面定义好版本号,接下来引用依赖时也就不用写版本号了,像下面这样:
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>这样写之后,就可以不用继承spring-boot-starter-parent了,但依赖的版本号问题虽然解决了,但是关于打包的插件、编译的JDK版本、文件的编码格式等等这些配置,在没有parent的时候,这些统统要自己去配置。
Java版本的配置很简单,添加一个plugin即可:
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
  </configuration>
</plugin>编码格式,在pom.xml中加入如下配置:
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>建议:公司自定义的parent继承官方的SpringBoot parent或者将官方的parent拷贝到自定义的parent中。
relativePath
其他网址
Maven parent.relativePath 说明_gzt19881123的专栏-
pom.xml中<parent>和<modules>详解_盛夏与微风
 简介
网上一大堆不准确说明。获得准确说明的方法:直接在Idea里边,点击parent标签,进去查看。
- relativePath 是Maven为了寻找父模块pom.xml所额外增加的一个寻找路径
 - relativePath 默认值为 /pom.xml
 - Maven 寻找父模块pom.xml 的顺序如下:
 - first in the reactor of currently building projects
这里一个maven概念 反应堆(reactor ),意思就是先从工程里面有依赖相关的模块中找你引入的 parent 的pom.xml。 - then in this location on the filesystem
然后从 你定义的 <relativePath > 路径中找。如果设为空值(<relativePath />),则跳过该步骤。默认值 ../pom.xml 则是从上级目录中找啦。 - then the local repository
如果 (1)(2) 步骤没有则从 本地仓库找啦。 - and lastly in the remote repo
上面都找不到了,最后只能从远程仓库找啦,再找不到就报错给你看 
实例
采用默认值
默认值为/pom.xml。如果该工程属于父工程的子工程(即子工程文件夹在父工程文件夹内),则<relativePath>取默认值即可。如下所示
project A
  ----pom.xml
  project B
    ----pom.xml 自定义位置
如果该工程是父工程的平级工程(即父工程和子工程的文件夹均在同一个目录下),则需要显示指出父工程的pom.xml的位置
project A
  ----pom.xml
project B
  ----pom.xml此时<relativePath>为…/${project A foldername}/pom.xml
示例:
<parent>
    <!-- 父工程的相对目录 -->
    <relativePath>../parent/pom.xml</relativePath>
    <groupId>com.summerzhou</groupId>
    <artifactId>yycgproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>modules
其他网址
Maven 的聚合(多模块)和 Parent 继承_偶尔记一下 - mybatis.io-
简介
具有模块的项目被称为多模块或聚合项目。模块是此POM列出并作为一组执行的项目。通过一个pom.xml打包的项目可以将它们列为模块来聚合成一组项目进行构建,这些模块名是这些项目的相对目录。
打包方式要改为pom,不能使用jar。
示例:
<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-parent</artifactId>
  <version>2.0</version>
  <packaging>pom</packaging>
  <modules>
    <module>my-project</module>
    <module>another-project</module>
  </modules>
</project>实例项目
Dubbo系列--SpringBoot整合Dubbo实例_feiying0canglang的博客
项目结构

下边这种结构不需要modules节点

repositories
<repositories>
  <repository>
    <name>Nexus Snapshots</name>
    <id>snapshots-repo</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    <layout>default</layout>
    <releases>
      <enabled>false</enabled>
      <updatePolicy>always</updatePolicy>
      <checksumPolicy>warn</checksumPolicy>
    </releases>
    <snapshots>
      <enabled>true</enabled>
      <updatePolicy>never</updatePolicy>
      <checksumPolicy>fail</checksumPolicy>
    </snapshots>
  </repository>
</repositories>profiles
其他网址
Maven 教程(17)— Maven Profile 和 Filtering 简介_挖坑埋你
maven使用filter动态配置项目_登上庐山-
maven profile <filtering>true</filtering>的作用_坚持,让梦想闪耀!
build
其他网址
maven--pom.xml(build元素)_feiying0canglang的博客
properties
是为pom定义一些常量,在pom中的其它地方可以直接引用。例如:
<properties>
    <mysql.version>5.1.41</mysql.version>
    <file.encoding>UTF-8</file_encoding>
</properties>
<dependencyManagement>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
</dependencyManagement>还可以使用project.xxx引用pom里定义的其它属性:如$(project.version}
杂项
groupId:项目或组织的唯一标志,且配置时生成路径也由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo
artifactId:项目的通用名称
version:项目的版本
packaging:打包机制,如:pom,jar,war,maven-plugin,ejb,ear,rar,par
groupId,artifactId,version,packaging这四项组成了项目的唯一坐标。一般前面三项就可以组成项目的唯一坐标了。
name:用户描述项目的名称,无关紧要的东西,可选
url:只是写明开发团队的网站,无关紧要,可选
其他网址
Maven pom.xml中的元素modules、parent、properties以及import - 青石路
maven核心,pom.xml详解(转) - 一个人的天空@ - 
maven--Idea操作_feiying0canglang的博客-
《maven实战》










