Maven 学习笔记 - 生命周期、plugin

1. 什么是Maven?

maven是一个项目管理工具,它包含了:

  • 一个项目对象模型(POM: project object model)
  • 一组标准集合
  • 一个项目生命周期(Project Lifecycle)
  • 一个依赖管理系统(Dependency management system),
  • 用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑

maven的主要Objectives

  • 使得构建过程非常方便
  • 提供一个统一的构建系统是的
  • 提供项目质量信息
  • 促进更好的开发时间

2. Maven的核心功能

2.1 依赖管理:Maven工程对jar包的管理过程。

一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。

功能 功能描述
依赖调节 决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。
依赖管理 直接的指定手动创建的某个版本被使用。例如当一个工程 C 在自己的依赖管理模块包含工程 B,即 B 依赖于 A, 那么 A 即可指定在 B 被引用时所使用的版本。
依赖范围 包含在构建过程每个阶段的依赖。
依赖排除 任何可传递的依赖都可以通过 “exclusion” 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 “被排除的”。
依赖可选 任何可传递的依赖可以被标记为可选的,通过使用 “optional” 元素。例如:A 依赖 B, B 依赖 C。因此,B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。

2.2 项目构建(Build)

  1. 什么是项目构建?

    指的是项目从验证、编译、测试、运行、打包、检查、安装、部署整个过程都交给maven进行管理这个过程称为项目构建。

    开始 —> validate —> compile —> test —> package —> verify —> install —> deploy

    Maven 学习笔记 - 生命周期、plugin_第1张图片

注意:构建阶段是由插件目标构成

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

例如:clean 和 pakage 是构建阶段,dependency:copy-dependencies 是目标

mvn clean dependency:copy-dependencies package

这里的 clean 阶段将会被首先执行,然后 dependency:copy-dependencies 目标会被执行,最终 package 阶段被执行

3. maven的三个标准生命周期

3.1. clean:项目清理的处理,移除所有上一次构建生成的文件

生命周期阶段 描述
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作

执行 mvn clean, 将运行pre-clean,clean生命周期阶段

执行mvn post-clean,将运行pre-clean,clean,post-clean生命周期阶段

3.2. default/build:项目构建生命周期

重点关注validate、compile、test、package、install、deploy阶段。

生命周期阶段 描述
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
initialize(初始化) 初始化构建状态,比如设置属性值。
generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
compile(编译) 编译项目的源代码。
process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。
process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。
generate-test-resources(生成测试资源文件) 为测试创建资源文件。
process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。
test-compile(编译测试源码) 编译测试源代码到测试目标目录.
process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。
test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。
prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。
post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。

3.3 site 项目站点文档创建的处理

生命周期 描述
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
将 maven-antrun-plugin:run 目标添加到 Site 生命周期的所有阶段中。这样我们可以显示生命周期的所有文本信息。

3. 约定的目录结构

Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mtcbNnfv-1592801782682)(/Users/zhiysong/Library/Application Support/typora-user-images/image-20200604150727817.png)]

4. Maven仓库的类型

  1. 仓库类型:

    • 本地仓库:

      默认是**%USER_HOME%/.m2/repository**,可以在**%M2_HOME%/conf/settings.xml**中进行修改。执行maven时,依赖将被下载到本地仓库。

      <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
         http://maven.apache.org/xsd/settings-1.0.0.xsd">
            <localRepository>C:/MyLocalRepositorylocalRepository>
      settings>
      
    • 本地仓库:

      Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

      由 Maven 社区管理。不需要配置。需要通过网络才能访问。

      http://search.maven.org/#browse

    • 远程仓库

      如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。

  2. 当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

    • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
    • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
    • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
    • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
  3. 修改默认的maven中央仓库

    • 第一步:修改%M2_HOME%/conf/settings.xml,添加mirrors节点

      <mirrors>
          <mirror>
            <id>alimavenid>
            <name>aliyun mavenname>
            <url>http://maven.aliyun.com/nexus/content/groups/public/url>
            <mirrorOf>centralmirrorOf>        
          mirror>
      mirrors>
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sv2hMjFn-1592801782684)(/Users/zhiysong/Library/Application Support/typora-user-images/image-20200604152407778.png)]

    • 第二步:pom.xml文件中添加:

      <repositories>  
              <repository>  
                  <id>alimavenid>  
                  <name>aliyun mavenname>  
                  <url>http://maven.aliyun.com/nexus/content/groups/public/url>  
                  <releases>  
                      <enabled>trueenabled>  
                  releases>  
                  <snapshots>  
                      <enabled>falseenabled>  
                  snapshots>  
              repository>  
      repositories>
      

5. Maven的常用命令

每一个构建项目的命令都对应了maven底层一个插件。

  • clean:删除项目中已经编译好的信息,删除target目录
  • compile:Maven工程的编译命令,用于编译项目的源代码,将src/main/java下的文件编译成class文件输出到target目录下。
  • test:使用合适的单元测试框架运行测试。
  • package:将编译好的代码打包成可分发的格式,如JAR,WAR。
  • install:安装包至本地仓库,以备本地的其它项目作为依赖使用。
  • deploy:复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)。

6. POM介绍

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

6.1 POM 中可以指定以下配置:

  • 项目依赖
  • 插件
  • 执行目标
  • 项目构建 profile
  • 项目版本
  • 项目开发者列表
  • 相关邮件列表信息

6.2 POM中的必需字段

所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version

节点 描述
project 工程的根标签。
modelVersion 模型版本需要设置为 4.0。
groupId 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。
artifactId 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。
version 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。

 
    
    <modelVersion>4.0.0modelVersion>
    
    <groupId>com.companyname.project-groupgroupId>
 
    
    <artifactId>projectartifactId>
 
    
    <version>1.0version>
project>

6.3 POM标签详解

https://www.runoob.com/maven/maven-pom.html

7. Maven中的常用插件

Maven 提供了下面两种类型的插件:

类型 描述
Build plugins 在构建时执行,并在 pom.xml 的 元素中配置。
Reporting plugins 在网站生成过程中执行,并在 pom.xml 的 元素中配置。

下面是一些常用插件的列表:

插件 描述
clean 构建之后清理目标文件。删除目标目录。
compiler 编译 Java 源文件。
surefile 运行 JUnit 单元测试。创建测试报告。
jar 从当前工程中构建 JAR 文件。
war 从当前工程中构建 WAR 文件。
javadoc 为工程生成 Javadoc。
antrun 从构建过程的任意一个阶段中运行一个 ant 任务的集合。

8. Maven构建配置文件

构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值。

使用构建配置文件,你可以为不同的环境,比如说生产环境(Production)和开发(Development)环境,定制构建方式。

配置文件在 pom.xml 文件中使用 activeProfiles 或者 profiles 元素指定,并且可以通过各种方式触发。配置文件在构建时修改 POM,并且用来给参数设定不同的目标环境(比如说,开发(Development)、测试(Testing)和生产环境(Production)中数据库服务器的地址)。

8.1 构建配置文件类型

类型 在哪定义
项目级(Per Project) 定义在项目的POM文件pom.xml中
用户级 (Per User) 定义在Maven的设置xml文件中 (%USER_HOME%/.m2/settings.xml)
全局(Global) 定义在 Maven 全局的设置 xml 文件中 (%M2_HOME%/conf/settings.xml)

8.2 配置文件激活

https://www.runoob.com/maven/maven-build-profiles.html

Maven的构建配置文件可以通过多种方式激活。

  • 使用命令控制台输入显式激活配置文件
  • 通过 maven 设置激活配置文件
  • 基于环境变量(用户或者系统变量)激活配置文件
  • 操作系统设置(比如说,Windows系列)。
  • 文件的存在或者缺失。

9. maven项目模板:mvn archetype:generate

使用如下命令去块数常见java项目。

mvn archetype:generate

mvn archetype:generate "-DgroupId=com.companyname.bank" "-DartifactId=consumerBanking" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DinteractiveMode=false"

10. Maven快照(SNAPSHOT)

1. 什么是快照?

快照是一种特殊的版本,指定了某个当前的开发进度的副本。

不同于常规的版本,Maven 每次构建都会在远程仓库中检查新的快照。 现在 data-service 团队会每次发布更新代码的快照到仓库中,比如说 data-service:1.0-SNAPSHOT 来替代旧的快照 jar 包。

2. 项目快照 VS 版本

对于版本,如果 Maven 以前下载过指定的版本文件,比如说 data-service:1.0,Maven 将不会再从仓库下载新的可用的 1.0 文件。若要下载更新的代码,data-service 的版本需要升到1.1。

快照的情况下,每次 app-ui 团队构建他们的项目时,Maven 将自动获取最新的快照(data-service:1.0-SNAPSHOT)

11. Maven自动化部署

Maven 使用 maven-release-plugin 插件来完成以下任务。

mvn release:clean

清理工作空间,保证最新的发布进程成功进行。

mvn release:rollback

在上次发布过程不成功的情况下,回滚修改的工作空间代码和配置保证发布过程成功进行。

mvn release:prepare

你可能感兴趣的:(问题总结,maven,生命周期)