Apache Maven官网
https://maven.apache.org/index.html

Maven in 5 Minutes
https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

Maven Getting Started Guide
https://maven.apache.org/guides/getting-started/index.html

Spring Maven Repository
http://repo.spring.io/release
http://repo.spring.io/snapshot

Maven 基础

Apache Maven是一个软件项目管理的综合工具。基于项目对象模型(POM)的概念,提供管理项目的构建、文档、报告、依赖、发布等方法,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。

maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

Maven的基本原理很简单,采用远程仓库和本地仓库以及一个核心的配置文件pom.xml,pom.xml中定义的jar文件从远程仓库下载到本地仓库,各个项目使用同一个本地仓库的jar,同一个版本的jar只需下载一次,而且避免每个应用都去拷贝jar。同时它采用了现在流行的插件体系架构,所以maven的核心非常的小,只有几兆大小的文件,在执行maven任务时,才会自动下载需要的插件。

Maven入门指南(一)
http://ifeve.com/maven-1/

Maven实战(一)安装和配置
http://www.iteye.com/topic/1123187

使用Eclipse构建Maven项目 (step-by-step)
http://blog.csdn.net/qjyong/article/details/9098213

Maven 核心概念

Artifact:项目产生物,主要有jar, war, maven插件

构建生命周期、阶段和目标

Maven 的构建过程被分解为 **构建生命周期(lifecycle)、阶段(phases)和目标(goals)**。
一个构建周期由一系列的构建阶段组成,每一个构建阶段由一系列的目标组成。当你运行 Maven 的时候,你会传入一条命令。这条命令就是构建生命周期、阶段或目标的名字。如果执行一个生命周期,该生命周期内的所有构建阶段都会被执行。如果执行一个构建阶段,在预定义的构建阶段中,所有处于当前构建阶段之前的阶段也都会被执行。

生命周期(Lifecycle)

Maven 有以下三个标准的生命周期:

  • clean:项目清理的处理
  • default(或 build):项目部署的处理
  • site:项目站点文档创建的处理
  • 一个典型的 Maven 构建(build)生命周期(default 生命周期)是由以下几个阶段的序列组成的:

    验证 validate 验证项目是否正确且所有必须信息是可用的 编译 compile 源代码编译在此阶段完成 测试 Test 使用适当的单元测试框架(例如JUnit)运行测试。 包装 package 创建JAR/WAR包如在 pom.xml 中定义提及的包 检查 verify 对集成测试的结果进行检查,以保证质量达标 安装 install 安装打包的项目到本地仓库,以供其他项目使用 部署 deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

    Introduction to the Build Lifecycle
    https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

    mvn clean package 依次执行了 clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
    mvn clean install 依次执行了 clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
    mvn clean deploy 依次执行了 clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。

    构建阶段(Phase)由插件目标(Goal)构成

    一个插件目标代表一个特定的任务(比构建阶段更为精细),这有助于项目的构建和管理。这些目标可能被绑定到多个阶段或者无绑定。不绑定到任何构建阶段的目标可以在构建生命周期之外通过直接调用执行。这些目标的执行顺序取决于调用目标和构建阶段的顺序。

    例如,考虑下面的命令:
    mvn clean dependency:copy-dependencies package
    clean 是构建周期,pakage 是构建阶段,dependency:copy-dependencies 是目标
    这里的 clean 周期将会被首先执行,然后 dependency:copy-dependencies 目标会被执行,最终 package 阶段被执行。

    依赖和仓库

    Maven执行时,其中一个首要目标就是检查项目的 **依赖(dependencies)**。依赖是你的项目用到的jar文件(java库)。如果在本地仓库中不存在该依赖,则Maven会从中央仓库下载并放到本地仓库。本地仓库只是你电脑硬盘上的一个目录。你可以根据需要制定本地仓库的位置。你也可以指定下载依赖的远程仓库的地址。

    插件plugins

    构建 **插件(plugins)**可以向构建阶段中增加额外的构建目标。如果Maven标准的构建阶段和目标无法满足项目构建的需求,你可以在POM文件里增加插件。Maven有一些标准的插件供选用,如果需要你可以自己实现插件。

    配置文件profiles

    **配置文件(profiles)**用于以不同的方式构建项目。
    比如,你可能需要在本地环境构建,用于开发和测试,你也可能需要构建后用于开发环境。这两个构建过程是不同的。在POM文件中增加不同的构建配置,可以启用不同的构建过程。当运行Maven时,可以指定要使用的配置。

    比如,一个项目可能会有多个子module,在特定情况下可能只需要build其中几个module,可以通过 profile 区分。

    安装配置

    Mac Brew 安装 maven

    安装maven
    brew install maven

    Intel Mac 安装目录 /opt/homebrew/Cellar/maven/3.8.4
    M1 Mac 安装目录 /opt/homebrew/Cellar/maven/3.8.4

    安装后添加 JAVA_HOME 环境变量

    vim ~/.zshrc
    export JDK8_HOME="/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home"
    export JAVA_HOME=$JDK8_HOME
    source ~/.zshrc
    

    Windows下安装及配置maven

    http://maven.apache.org/
    下载windows版 apache-maven-3.3.9-bin.zip
    解压后将文件夹apache-maven-3.3.9拷贝到C:\Program Files即安装完成

    配置环境变量
    安装配置JDK:安装JDK1.8,新建系统环境变量JAVA_HOME,变量值为C:\Program Files\Java\jdk1.8.0_111
    新建系统环境变量MAVEN_HOME,变量值为C:\Program Files\apache-maven-3.3.9
    在系统变量Path中增加%MAVEN_HOME%\bin
    配置完成后,可打开命令行,输入mvn -v,有版本信息说明配置成功

    CentOS7安装maven3

    安装maven yum源

    通过 yum-config-manager 安装 maven 源

    $ sudo yum-config-manager --add-repo http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
    已加载插件:fastestmirror
    adding repo from: http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
    grabbing file http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo to /etc/yum.repos.d/epel-apache-maven.repo
    repo saved to /etc/yum.repos.d/epel-apache-maven.repo
    

    或者直接 wget 把repo文件下载到 /etc/yum.repos.d/ 目录中
    wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

    yum安装maven最新版

    yum install -y apache-maven
    查看 maven 版本

    $ mvn -version
    Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)
    Maven home: /usr/share/apache-maven
    Java version: 1.8.0_232, vendor: Oracle Corporation
    Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre
    Default locale: zh_CN, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-957.1.3.el7.x86_64", arch: "amd64", family: "unix"
    

    yum 安装 maven 后会自动设置 MAVEN_HOMEM2_HOME 环境变量, 并将 mvn 命令链接到 /usr/bin/mvn

    $ env|egrep 'MAVEN_HOME|M2_HOME'
    MAVEN_HOME=/usr/share/apache-maven
    M2_HOME=/usr/share/apache-maven
    $ ll -h /usr/bin/mvn
    lrwxrwxrwx. 1 root root 31 12月 26 11:11 /usr/bin/mvn -> /usr/share/apache-maven/bin/mvn
    

    Maven Wrapper(mvnw)

    背景
    Maven 是一款非常流行的 Java 项目构建软件,它集项目的依赖管理、测试用例运行、打包、构件管理于一身,是我们工作的好帮手,maven 飞速发展,它的发行版本也越来越多,如果我们的项目是基于 Maven 构件的,那么如何保证拿到我们项目源码的同事的 Maven 版本和我们开发时的版本一致呢,可能你认为很简单,一个公司嘛,规定所有的同事都用一个 Maven 版本不就万事大吉了吗?一个组织内部这是可行的,要是你开源了一个项目呢?如何保证你使用的 Maven 的版本和下载你源码的人的 Maven 的版本一致呢,这时候 mvnw 就大显身手了。

    而 Gradle 提供了一个 Wrapper,可以很好解决版本切换的问题,当然更重要的是不需要预安装Gradle。

    Maven虽然没有官方的Wrapper,但是有一个第三方的Wrapper可以使用。
    https://github.com/takari/maven-wrapper

    mvnw 全名是 Maven Wrapper,它的原理是在 maven-wrapper.properties 文件中记录你要使用的 Maven 版本,当用户执行 mvnw clean 命令时,发现当前用户的 Maven 版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行mvn命令,比如刚才的mvn clean。

    为项目添加mvnw支持很简单,有两种方式:

    方法一:在Pom.Xml中添加Plugin声明:

    <plugin>
        <groupId>com.rimerosolutions.maven.plugins</groupId>
        <artifactId>wrapper-maven-plugin</artifactId>
        <version>0.0.4</version>
    </plugin>
    

    这样当我们执行mvn wrapper:wrapper 时,会帮我们生成 mvnw.bat, mvnw, maven/maven-wrapper.jar, maven/maven-wrapper.properties 这些文件。

    然后我们就可以使用mvnw代替mvn命令执行所有的maven命令,比如mvnw clean package

    方法二:直接执行Goal(推荐使用这种)
    mvn -N io.takari:maven:wrapper -Dmaven=3.3.3 表示我们期望使用的Maven的版本为3.3.3

    产生的内容和第一种方式是一样的,只是目录结构不一样,maven-wrapper.jar和maven-wrapper.properties在”.mvn/wrapper”目录下

    使用的注意事项

    1、由于我们使用了新的Maven ,如果你的settings.xml没有放在当前用户下的.m2目录下,那么执行mvnw时不会去读取你原来的settings.xml文件

    2、在mvnw.bat中有如下的一段脚本:if exist "%M2_HOME%\bin\mvn.cmd" goto init,意思是如果找到mvn.cmd就执行初始化操作,但是Maven早期版本不叫mvn.cmd,而是叫mvn.bat,所以会报”Error: M2_HOME is set to an invalid directory”错误,改成你本地的maven的匹配后缀就好了。

    mvnw脚本

    mvnw是什么?
    Maven Wrapper/Maven保持构建工具版本一直的工具
    mvnw是一个maven wrapper script,它可以让你在没有安装maven或者maven版本不兼容的条件下运行maven的命令.

  • 它会寻找maven在你电脑环境变量path中的路径
  • 如果没有找到这个路径它就会自动下载maven到一个默认的路径下,之后你就可以运行maven命令了
  • 有时你会碰到一些项目的peoject和你本地的maven不兼容,它会帮你下载合适的maven版本,然后运行
  • mvnw是什么(Maven Wrapper/Maven保持构建工具版本一直的工具)
    https://www.cnblogs.com/EasonJim/p/7620085.html

    maven-wrapper介绍
    https://juejin.im/post/5b5c742751882508603d005e

    http://mvnrepository.com/artifact/com.rimerosolutions.maven.plugins/wrapper-maven-plugin

    Maven命令

    mvn [options] [<goal(s)>] [<phase(s)>]
    -s,--settings <arg>,指定用户 settings.xml 文件
    -D,--define <arg>,定义系统属性,例如 -Dmaven.test.skip=true
    -v,--version,查看maven版本
    -X,--debug,打开debug输出
    -e,--errors 显示maven运行出错的信息

    mvn compile,在项目根目录下执行mvn compile命令可编译项目,build success之后在项目根目录下生成target目录,该目录下存放项目编译后的文件,如.class文件

    mvn test,会执行src/test/java 下的Junit测试代码,当然在执行测试之前会自动执行编译命令

    mvn package,会将项目打成jar包,并放在target目录中。执行此命令之前会先执行编译和测试命令
    mvn package -Pdev 指定 dev profile 打包。不写则默认加载 active 的配置。

    mvn install,会将项目jar包安装到本地仓库中,以便其他项目使用。执行此命令之前会先执行编译,测试,打包命令

    mvn clean,清理项目,会删除target文件夹,该命令可以结合其他命令运行

    mvn deploy,部署构件到maven远程仓库,需要配置<distributionManagement>/<repository>和对应的认证信息。

    -Pprofile 指定不同profile

    -P,--activate-profiles <arg> 指定 Profile 配置,可以用于区分环境,例如 mvn package -PprofileTwo

    -pl/-am/-amd 构建指定模块

    -pl, --projects 构建指定的模块,模块间用逗号分隔
    -am, --also-make 同时构建所列模块的依赖模块,比如A依赖B,B依赖C,构建B,同时构建C
    -amd, --also-make-dependents 同时构建依赖于所列模块的模块,比如A依赖B,B依赖C,构建B,同时构建A

    例1,单独构建 common 模块,同时构建 common 模块依赖的模块
    mvn install -pl common -am

    例2,单独构建 common 模块,同时构建 common 依赖的模块,并构建依赖 common 的模块
    mvn install -pl common -am -amd

    mvn -U 强制更新snapshot依赖

    -U,--update-snapshots 强制去远程更新 snapshot 的插件或依赖,默认每天只更新一次。

    mvn clean install -e -U 强制更新依赖

    -Dmaven.test.skip=true 跳过测试

    mvn -U clean install -Dmaven.test.skip=true --settings settings.xml 强制更新并install,跳过测试,指定 settings 文件

    -Dmaven.source.skip=true 跳过源码jar

    -Dmaven.source.skip=true 是 Maven 的一个命令行选项,当设置为 true 时,它将跳过构建项目源码的 JAR 文件。

    mvn -T 并发线程数

    mvn -T 4 clean install 4线程并发
    mvn -T 1C clean install 等于cpu核数
    mvn -T 1.5C clean install 1.5倍cpu核数

    mvn dependency:tree 查看依赖树

    Apache/ Maven/ Plugins/ Apache Maven Dependency Plugin/ dependency:tree
    https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

    mvn dependency:tree,查看maven依赖树,需要再 pom.xml 所在目录执行此命令

    mvn dependency:tree | grep kafka 查看 kafka 依赖的版本

    mvn dependency:tree -Dincludes=artifactId1,artifactId2,... 只查看指定的依赖
    -Dincludes 指定逗号分割的依赖列表,语法为 [groupId]:[artifactId]:[type]:[version],其中每部分都是可选的,也都可以用通配符 * 匹配。
    例如
    mvn dependency:tree -Dincludes=org.apache.* 只查看 groupId 是 apache 的依赖
    mvn dependency:tree -Dincludes=:::*-SNAPSHOT 只查看 snapshot 依赖
    mvn dependency:tree -Dincludes=:httpclient 查看 httpclient 依赖

    mvn dependency:tree -Dexcludes=artifactId1,artifactId2,... 排除指定的依赖,格式同 -Dincludes

    mvn help:describe -Dcmd=phase 列出phase的全部goal

    mvn help:describe -Dcmd=PHASENAME

    例,查看 compile 生命周期的阶段:

    mvn help:describe -Dcmd=compile
    [INFO] 'compile' is a phase corresponding to this plugin:
    It is a part of the lifecycle for the POM packaging 'pom'. This lifecycle includes the following phases:
    * validate: Not defined
    * initialize: Not defined
    * generate-sources: Not defined
    * process-sources: Not defined
    * generate-resources: Not defined
    * process-resources: Not defined
    * compile: Not defined
    * process-classes: Not defined
    * generate-test-sources: Not defined
    * process-test-sources: Not defined
    * generate-test-resources: Not defined
    * process-test-resources: Not defined
    * test-compile: Not defined
    * process-test-classes: Not defined
    * test: Not defined
    * prepare-package: Not defined
    * package: Not defined
    * pre-integration-test: Not defined
    * integration-test: Not defined
    * post-integration-test: Not defined
    * verify: Not defined
    * install: org.apache.maven.plugins:maven-install-plugin:2.4:install
    * deploy: org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
    

    BOM

    BOM(Bill Of Materials),材料清单。BOM 是一个普通的 POM 文件,其中罗列了一个工程的所有依赖和其对应的版本。该文件一般被其它工程使用,当其它工程引用 BOM 中罗列的依赖时,不用显示指定具体的版本,会自动使用 BOM 对应的版本。

    引用 bom 的两种方式:
    1、通过 parent 引用 bom,比如我们的 spring boot 项目通常将 parent 设为 spring-boot-starter-parent, spring-boot-starter-parent 就是个 bom

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.6.5</version>
      <relativePath/> <!-- lookup parent from repository -->
    </parent>
    

    2、通过 dependencyManagement 引用,比如我们引入 spring cloud 依赖时都会在根 pom 的 dependencyManagement 中加入:

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring.cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    

    Maven POM

    概述

    POM全称是Project Object Model,即项目对象模型。pom.xml是maven的项目描述文件,它类似与antx的project.xml文件。pom.xml文件以xml的形式描述项目的信息,包括项目名称、版本、项目id、项目的依赖关系、编译环境、持续集成、项目团队、贡献管理、生成报表等等。总之,它包含了所有的项目信息。
    Maven的中心思想是POM文件(项目对象模型)。POM文件是以XML文件的形式表述项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。POM文件应该位于项目的根目录下。
    Maven的POM文件是一个xml文件,描述项目用到的资源,包括源代码目录、测试代码目录等的位置,以及项目依赖的外部jar包。
    POM文件描述的是构建“什么”,而不是“如何”构建。如何构建是取决于Maven的构建阶段和目标。当然,如果需要,你也可以向Maven构建阶段中添加自定义的目标。
    每一个项目都有一个POM文件。POM文件即pom.xml,应该放在项目的根目录下。一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。

    下图说明了Maven是如何使用POM文件的,以及POM文件的主要组成部分:

    POM Reference(POM官方文档)
    https://maven.apache.org/pom.html

    Maven3.3.9 官方参考文档(POM元素详解)
    https://maven.apache.org/ref/3.3.9/maven-model/maven.html

    史上最全的maven pom.xml文件教程详解
    http://blog.csdn.net/yaerfeng/article/details/26448417

    Properties属性

    自定义属性

    在 pom.xml 文件的 <properties> 标签下定义的Maven属性
    <properties><some.var>value</some.var></properties> 的值可通过 ${some.var} 访问

    POM属性

    使用 pom 属性可以引用到 pom.xml 文件对应元素的值
    例如 <project><version>1.0</version></project> 可通过 ${project.version} 引用
    例如 ${project.build.finalName} 表示打包名称

    settings.xml文件属性

    与pom属性同理, 用户使用以 settings. 开头的属性引用 settings.xml 文件中的XML元素值
    例如 <settings><offline>false</offline></settings> 可通过 ${settings.offline} 访问
    例如 ${settings.localRepository} 表示本地仓库的地址;

    Java系统属性

    所有可通过 java.lang.System.getProperties() 访问的 Java 系统属性都可以使用 Maven 引用
    例如 ${java.home}

    环境变量属性

    所有的环境变量都可以用以env.开头的Maven属性引用
    例如 ${env.PATH}, ${env.JAVA_HOME}
    使用 mvn help:system 命令可查看所有环境变量;

    POM Reference / The Basics / Properties
    https://maven.apache.org/pom.html#Properties

    Super POM

    就像Java中的所有类都隐式继承自Object一样,对于pom.xml来说,它隐式继承超级POM,它包含了一些可以被继承的默认设置。
    Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被方便的重写。

    查看Super POM

    查看 Super POM 默认配置的一个简单方法如下:
    在你的电脑上的任意目录下创建一个 pom.xml 文件,使用最小pom中的内容,然后打开命令控制台,到 pom.xml 所在的目录下执行以下 mvn 命令:

    mvn help:effective-pom
    

    Maven 将会开始处理并显示 effective-pom,由于创建的是最小pom,所以所有内容都继承自超级POM

    或者打开Maven安装目录中的lib/maven-model-builder-3.3.9.jar 包,能找到超级POM:maven-model-builder-3.3.9.jar\org\apache\maven\model\pom-4.0.0.xml,它是所有Maven POM的父POM,所有Maven项目继承该配置。

    Maven-3.3.9的Super POM内容

    <?xml version="1.0" encoding="UTF-8"?>
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
        http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
    <!-- START SNIPPET: superpom -->
    <project>
      <modelVersion>4.0.0</modelVersion>
      <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <releases>
            <updatePolicy>never</updatePolicy>
          </releases>
        </pluginRepository>
      </pluginRepositories>
      <build>
        <directory>${project.basedir}/target</directory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
        <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
          </testResource>
        </testResources>
        <pluginManagement>
          <!-- NOTE: These plugins will be removed from future versions of the super POM -->
          <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
          <plugins>
            <plugin>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>1.3</version>
            </plugin>
            <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <version>2.2-beta-5</version>
            </plugin>
            <plugin>
              <artifactId>maven-dependency-plugin</artifactId>
              <version>2.8</version>
            </plugin>
            <plugin>
              <artifactId>maven-release-plugin</artifactId>
              <version>2.3.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
      <reporting>
        <outputDirectory>${project.build.directory}/site</outputDirectory>
      </reporting>
      <profiles>
        <!-- NOTE: The release profile will be removed from future versions of the super POM -->
        <profile>
          <id>release-profile</id>
          <activation>
            <property>
              <name>performRelease</name>
              <value>true</value>
            </property>
          </activation>
          <build>
            <plugins>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-sources</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-javadoc-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-javadocs</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                  <updateReleaseInfo>true</updateReleaseInfo>
                </configuration>
              </plugin>
            </plugins>
          </build>
        </profile>
      </profiles>
    </project>
    <!-- END SNIPPET: superpom -->
    
  • Super POM:
    https://maven.apache.org/pom.html#The_Super_POM
  • project