如何理解maven插件, maven lifeCycle和plugin的关系


pom文件定义了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。

pom文件构成(主要)

根元素和必要配置

<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>
    <!-- 公司或者组织的唯一标志,也是打包成jar包路径的依据 -->
    <!-- 例如com.companyname.project-group,maven打包jar包的路径:/com/companyname/project-group -->
    <groupId>com.companyname.project-group</groupId>
 
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>project</artifactId>
 
    <!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->
    <version>1.0</version>

    <!--项目产生的构件类型,包括jar、war、ear、pom等 -->
    <packaging>jar</packaging>
</project>
工程师    

父项目和parent元素

    <!--父项目的坐标,坐标包括group ID,artifact ID和version。 -->
    <!--如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值 -->
    <parent>
        <!--被继承的父项目的构件标识符 -->
        <artifactId>com.companyname.project-group</artifactId>
        <!--被继承的父项目的全球唯一标识符 -->
        <groupId>base-project</groupId>
        <!--被继承的父项目的版本 -->
        <version>1.0.1-RELEASE</version>
 
        <!-- 父项目的pom.xml文件的相对路径,默认值是../pom.xml。 -->
        <!-- 寻找父项目的pom:构建当前项目的地方--)relativePath指定的位置--)本地仓库--)远程仓库 -->
        <relativePath>../pom.xml</relativePath>
    </parent>

项目依赖相关信息

​ dependencyManagement来声明依赖,通过dependencies元素来管理依赖。

​ 1、依赖坐标 2、依赖类型 3、依赖传递 4、依赖范围

项目构建需要的信息

build标签定义了构建项目需要的信息

路径管理
        <sourceDirectory />
        <testSourceDirectory />
        <outputDirectory />
        <testOutputDirectory />        
        <scriptSourceDirectory />        
sourceDirectory:项目源码目录,构建系统会编译目录里的源码, 定义的是相对于pom文件的相对路径;
testSourceDirectory:项目单元测试源码目录,定义的也是是相对于pom文件的相对路径;
outputDirectory:被编译过的应用程序class文件存放的目录,也是是相对于pom文件的相对路径;
testOutoutDIrectory:被编译过的测试class文件存放的目录,也是是相对于pom文件的相对路径;
scriptSourceDirectory:项目脚本源码目录,也是是相对于pom文件的相对路径。由于脚本是解释性的语言,所以该目录下的内容,会直接被拷贝到输出目录,而不需要编译。

maven 特点1: (在遵循约定大于配置原则下,不需要配置)

资源管理
<resources>          
    <resource>      
        <targetPath />
        <directory />
        <includes />
        <excludes />
    </resource>
</resources>
<testResources>           
    <testResource>
        <targetPath />
        <directory />
        <includes />
        <excludes />
    </testResource>
<testResources>
<resources>  <testResources> 描述了项目相关 测试相关的所有资源路径,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。

targetPath:描述了资源的目标输出路径,该路径是相对于target/classes的路径; 如果是想要把资源直接放在target/classes下,不需要配置该元素
directory:描述打包前的资源的存放路径,这个路径是相对于pom文件所在目录的相对路径;
includes:包含的模式列表,例如**/*.xml。只有符合条件的资源文件才会在打包的时候被放入到输出路径中;
excludes:排除的模式列表,例如**/*.xml,符合的资源文件不会在打包的时候会被过滤掉。
插件管理

作用: 编译代码,创建jar文件,创建war文件,创建项目文档等。

​ 1. 插件管理相关的元素有两个,包括pluginManagement和plugins。

  1. 怎么理解插件

    maven 特点2 :Maven本质上是一个空空的插件框架,不具备执行具体任务的能力,所有这些任务都交给插件来完成。 进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标。

    像编译是通过maven-compile-plugin实现的、测试是通过maven-surefire-plugin实现的,maven也内置了很多插件,所以我们在项目进行编译、测试、打包的过程是没有感觉到。

一个插件通常提供了一组目标,可使用以下语法来执行:

mvn [plugin-name]:[goal-name]
该命令的意思是:执行“plugin-name”插件的“goal-name”目标(或者称为动作)

例如:一个 Java 项目可以使用 Maven 编译器插件来编译目标,通过运行以下命令编译

`mvn compiler:compile'    编译位于src/main/java/目录下的主源码
`mvn compiler:testCompile'    编译位于src/test/java/目录下的测试源码
  1. maven 插件列表
lifeCycle生命周期和插件的关系?
1. maven项目生命周期和阶段

http://maven.apache.org/ref/3.5.0/maven-core/lifecycles.html

  • Maven 把构建项目的过程,总体分为三个生命周期(lifecycle):
    1、默认构建:default
    2、项目清理:clean
    3、项目建站:site
  • 每个生命周期又由许多阶段(phase)组成。
  • image-20220126160839829 **每个阶段,都可以指定默认执行的目标(goal),去具体执行某项工作。**

举例说明:

1、默认构建:default,分为以下阶段:
1)validate
2)compile
3)test
4)package
5)verify
6)install
7)deploy
这些阶段是有顺序的,构建时按序逐一执行。

在命令行中 使用阶段 来执行构建。只需输入阶段名称即可。
Maven会按顺序执行该阶段之前的所有阶段。
例如:
mvn install
mvn clean package

问题: 前面说maven本身是不执行任何具体任务的,都是通过插件执行, 通过 阶段 构建时,是怎么指定 调用那个插件的呢?

2. 阶段被绑定了默认的执行插件及目标

https://maven.apache.org/ref/3.5.0/maven-core/default-bindings.html

构建阶段的默认执行插件及目标是通过 packaging 的类型指定的。

package 类型 jar war pom 等 . packaging 的类型中定义了一系列的阶段,及每个阶段要执行哪个插件的哪个目标。

拿 jar 举例(jar 是 maven 默认的 packaging 类型,packaging 未指定时就是 jar 类型),
如果 packaging 类型是 jar,则其相应的 maven 各个阶段所对应的插件的默认执行的目标如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFjSnKGa-1643511228386)(D:\Typora笔记2\分享\3_补充maven.assets\image-20220126163541139.png)]

所以当指定了 packaging 的类型时,可以直接调用阶段的名称来执行 Maven 构建。

3. 修改构建阶段默认执行的插件及目标

拿 compiler 核心插件举例。该插件有两个目标:compile,testCompile
前者编译 main 目录下的源码
后者编译 test 目录下的源码

packaging 为 jar 时,它在 compile 阶段只绑定了 compiler 插件的 compile 目标。
即:compile 阶段不执行 testCompile 目标。
我们可以在 compile 阶段,把 testCompile 目标也添加进来:

<build>  
  <finalName>test</finalName>  
  <plugins>  
      <plugin>  
          <groupId>org.apache.maven.plugins</groupId>  
          <artifactId>maven-compiler-plugin</artifactId>  
          <version>3.6.1</version>  
          <executions>  
              <execution>  
                  <configuration>  
                      <target>1.7</target>  
                      <source>1.7</source>  
                  </configuration>  
                  <phase>compile</phase>  
                  <goals>  
                      <goal>testCompile</goal>   
                  </goals>  
              </execution>  
          </executions>  
      </plugin>  
  </plugins>  
</build>  
总结

maven特点 3:

Maven 是基于插件的项目 maven构建过程是基于阶段的构建的

  • 构建阶段和插件是相互独立的
  • 构建阶段的默认执行插件及目标是通过 packaging 的类型指定的。

Assembly.xml maven 定制化打包

plugin 标签的配置项

 <!-- 可使用的插件列表 -->
            <plugins>
                <!--plugin元素包含描述插件所需要的信息。 -->
                <plugin>
                    <!--插件定位坐标三元素:groupId + artifactId + version -->
                    <groupId />
                    <artifactId />
                    <version />
                    <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
                    <executions>
                        <!--execution元素包含了插件执行需要的信息 -->
                        <execution>
                            <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
                            <id />
                            <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
                            <phase />
                            <!--配置的执行目标 -->
                            <goals />
                            <!--配置是否被传播到子POM -->
                            <inherited />
                            <!--作为DOM对象的配置 -->
                            <configuration />
                        </execution>
                    </executions>
                    <!--项目引入插件所需要的额外依赖,参见dependencies元素 -->
                    <dependencies>
                            ......
                    </dependencies>
                    <!--任何配置是否被传播到子项目 -->
                    <inherited />
                    <!--作为DOM对象的配置 -->
                    <configuration />
                </plugin>
            </plugins>

Assemly.xml文件的内容

format:指定打包类型;
includeBaseDirectory:指定是否包含打包层目录(比如finalName是output,当值为true,所有文件被放在output目录下,否则直接放在包的根目录下);
fileSets:指定要包含的文件集,可以定义多个fileSet;
directory:指定要包含的目录;
outputDirectory:指定当前要包含的目录的目的地。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值