文章目录



一. Maven 介绍

一. 简介

maven 是项目管理和整合工具,maven 为开发团队提供了一套完整的构建生命周期的框架,maven 使用了一个标准的目录结构和一个默认的构建声明周期。maven 使用约定优于配置的思想,表现在开发者创建 maven 项目在相应文件夹下放文件,不需要再去 pom.xml 修改什么配置了,POM 即工程对象模型,就是 pom.xml 直接放置于工程路径下,pom 中包含了两大部分——目标和插件,运行 maven 项目一般是加载 pom 文件,读取其中配置信息,执行目标

二. 历史

maven 最初是在 Jakarta Turbine 项目中为了简化构建而设计的。后来 apache 小组随后开发了 maven,能够同时构建多个工程,协助团队开发

三. 能够完成的工作


  1. 构建
  2. 文档生成
  3. 报告
  4. 依赖
  5. SCMs
  6. 发布
  7. 分发
  8. 邮件列表

二.POM 文件结构

一.pom.xml

pom.xml 结构:

<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>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.clean</id>
<phase>clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>clean phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

  1. pom 工程唯一标识​<groupId>com.companyname.project-group</groupId> <artifactId>project</artifactId> <version>1.0</version> ​

  • groupId:工程组的标识,就是工程组的名字,在一个项目组或者项目中通常是唯一的
  • artifactId:工程的标识,就是工程的名字,groupId + artifactId
  • version:工程的版本号

  1. 依赖写法:依赖一般直接从网上仓库复制过来,自己要写也不是不可以​​<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> </dependency> </dependencies> ​

  • dependency:依赖
  • scope:在某个作用域搜索依赖

  1. 插件写法构建任务中包含插件组,插件组中存在多个插件,每个插件中包含要执行的任务组,这个任务组中又包含多个任务,每个要执行的任务中含有执行在生命周期中什么阶段,要执行的目标组(目标组中含有多个目标),以及执行的配置,执行配置中含有具体任务组,任务组中是多个具体任务​​​
<!-- 构建部分 -->
<build>
<!-- 插件组 -->
<plugins>
<!-- 插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<!-- 执行组 -->
<executions>
<!-- 执行 -->
<execution>
<id>id.clean</id>
<!-- 阶段 -->
<phase>clean</phase>
<!-- 目标组 -->
<goals>
<!-- 目标 -->
<goal>run</goal>
</goals>
<!-- 执行配置 -->
<configuration>
<tasks>
<!-- 要执行的任务绑定 -->
<echo>clean phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

  • build:构建部分
  • plugin:插件
  • execution:执行部分
  • phase:阶段
  • goal:目标
  • configuration:执行配置
  • tasks:具体任务


二.项目中产生的文件结构

  • target

  • classes
    maven 编译的源码文件以及测试源码文件,其中文件可以被 java 命令所编译
  • generated-sources
  • maven-status
  • surefire-reports
    产生测试报告的存放地
  • site
    执行 site 命令产生的,里头有 index.html 说明文档。maven 使用的是 Doxia 文件处理引擎创建的文档,

三.super POM 与构建配置文件

一.super POM

所有的 POM 都会继承一个父 POM(不论这个父 POM 是否被显示定义了),其包含了一些可以被继承的默认设置,查看 super POM 的默认配置可以使用如下:

mvn help:effective-pom

二.构建配置文件

由于在生产环境或者开发环境存在有区别的构建过程,这时候可以使用构建配置文件来设置或者覆盖 maven 构建的默认配置。Profile 在 pom.xml 中使用 activeProfiles/profiles 元素指定,并且可以使用很多方式触发,Profile 可以在构建时候修改 POM


  • Profile 三种类型

  • Per Project:定义在 POM 文件中
  • Per User:定义在 Maven 设置 xml 文件中(%USER_HOME%/.m2/settings.xml)
  • Global:定义在 Maven 全局配置 xml 文件中(%M2_HOME%/.conf/settings.xml)

  • Profile 激活激活方式如下:

  • 使用命令控制台输入
  • 通过 maven 配置
  • 基于环境变量(用户/系统变量)
  • 操作系统配置
  • 现存/缺失文件


四.maven 生命周期

一. 生命周期概述

maven 有 3 套生命周期,生命周期中有阶段,阶段中有目标。各个生命周期独立,周期中有阶段,阶段有顺序,同一周期中后面阶段依赖于前面阶段,如调用 clean 生命周期的 clean 阶段,实际执行的是 pre-clean 和 clean;若调用 clean 生命周期的 clean 阶段和 default 的install 阶段,实际执行 pre-clean,clean 和 default 中的 install 之前的所有阶段


  • clean:清理项目,含 3 个阶段

  • pre-clean:执行清理前需要完成的任务
  • clean:清理上一次构建生成的文件
  • post-clean:执行清理后需要完成的工作

  • default(build):构建项目

  • validate:验证工程是否正确,所有需要的资源是否可用
  • compile:编译项目源代码
  • test:使用合适的单元测试框架来测试已编译好的源代码,这些测试是不需要已打包和部署的
  • package:把已编译的代码打包成可发布的格式,如 JAR
  • integration-test:如有需要将包进行处理和发布到一个能进行集成测试的环境
  • verify:运行所有检查,验证包是否有效且达到质量标准
  • install:把包安装到 maven 本地仓库,可被其他工程作为依赖使用
  • deploy:在集成或发布环境下执行,将最终版本的包拷贝到远程的仓库中,使其他开发者或者工程可以共享

  • site:建立和发布项目站点,含 4 个阶段

  • pre-site:生成项目站点前需要完成的工作
  • site:生成项目站点文档
  • post-site:生成项目站点后需要完成的工作
  • site-deploy:将项目站点发布到服务器


二. clean 生命周期

执行 clean 生命周期的命令

mvn post-clean

​返回上层讲解了 clean 生命周期分为哪几个阶段​

三. default(build)生命周期

这里是 maven 主要的生命周期,被用于构建应用。上面粗略的写了 default(build)生命周期的 8 个阶段,其实详细一点共有 20 个如下阶段

  • default(build)

  • validate:检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
  • initialize:初始化构建状态,例如设置属性。
  • generate-sources:生成编译阶段需要包含的任何源码文件。
  • process-sources:处理源代码,例如,过滤任何值(filter any value)。
  • generate-resources:生成工程包中需要包含的资源文件。
  • process-resources:拷贝和处理资源文件到目的目录中,为打包阶段做准备。
  • compile:编译工程源码。
  • process-classes:处理编译生成的文件,例如 Java Class 字节码的加强和优化。
  • generate-test-sources:生成编译阶段需要包含的任何测试源代码。
  • process-test-sources:处理测试源代码,例如,过滤任何值(filter any values)。
  • test-compile:编译测试源代码到测试目的目录。
  • process-test-classes:处理测试代码文件编译后生成的文件。
  • test:使用适当的单元测试框架(例如JUnit)运行测试。
  • prepare-package:在真正打包之前,为准备打包执行任何必要的操作。
  • package:获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文 件。
  • pre-integration-test:在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
  • integration-test:处理和部署必须的工程包到集成测试能够运行的环境中。
  • post-integration-test:在集成测试被执行后执行必要的操作。例如,清理环境。
  • verify:运行检查操作来验证工程包是有效的,并满足质量要求。
  • install:安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
  • deploy:拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

四. site 生命生命周期

site 生命周期上面也有讲解,​​点击这里返回上面 site 讲解处​

五.Maven 仓库


  • 本地 local
  • 中央 central
  • 远程 remote


  1. 本地仓库:
    在第一次运行任何 maven 命令时创建,其中保存你工程中下载的所有依赖。默认被创建在​​%USER_HOME%​​目录下,要修改其默认位置,可以在​​%M2_HOME%\conf​​中的​​settings.xml​​中修改 localRepository 标签来修改其位置
  2. 中央仓库:
    由 maven 社区提供的仓库
    阿里云中央仓库:​​https://maven.aliyun.com/mvn/view​​​sonatype 中央仓库:​​https://search.maven.org/​​​中央仓库依赖查询:​​https://mvnrepository.com/​​​maven 官方运维 2 号库:​​http://repo2.maven.org/maven2/​​​maven UK 架设仓库:​​http://uk.maven.org/maven2/​​​JBoss 仓库:​​http://repository.jboss.org/nexus/content/groups/public​​​
  3. 远程仓库:
    当 maven 在本地库和中央库中都找不到所需要的依赖信息,其会停止构建并输出错误到控制台。对于要使用远程仓库的话需要使用​​<repositories>​​标签写明远程仓库地址

六.Maven 依赖


  • 依赖的使用规则:

  1. 当多个手动创建的版本同时出现时,具体哪个版本的依赖会被使用,如果两个依赖版本在依赖树中的深度一样,那么第一个被声明的依赖会被使用
  2. 任何可传递的依赖都可以通过 exclusion 元素被排除在外
  3. 任何可传递的依赖都可以通过 optional 元素标记为可选择,如 A → B,B → C,B 可以标记 C 为可选的,这样 A 可以不再使用 C

七.Maven 插件

maven 本质上是一个依赖插件执行的框架,每个任务是由插件完成,插件常被用来创建压缩文件,编译,单元测试,创建文档等

plugin 中的 lifecycle→phase→goal→mojo


  • lifecycle 生命周期:maven 最高级别的控制单元,是一系列的 phase 组成,一个生命周期是一个大的任务的总称,不管其中有多少个子任务,中间的过程是 phase 完成的
  • phase:phase 是 lifecycle 中的任务单元,一个 phase 可以绑定很多个 goal,至少为 1 个,没有 goal 的 phase 是没有意义的
  • goal:执行任务的最小单元,可以绑定在任意个 phase 中
  • mojo:lifecycle-phase-goal 都是概念上的东西,mojo 才是做具体的事情,可以简单理解 mojo 是 goal 的实现类,其继承于 AbstractMojo,有一个 execute 方法

插件类型:


  • build plugins:在构建时执行,并在 pom.xml 中配置
  • reporting plugins:在网站生成过程中执行,并在 pom.xml 元素中配置

常用插件列表:


  • clean:构建之后清理目标文件,删除目标目录
  • compiler:编译 java 源文件
  • surefire:运行 Junit 单元测试,创建测试报告
  • jar:从当前工程中构建 JAR 文件
  • war:从当前工程中构建
  • javadoc:为工程生成javadoc
  • antrun:从构建过程的任意一个阶段中运行一个 ant 任务集合

插件用 plugins 元素定义,每个插件可以有多个目标,可以定义阶段,插件会使用 phase 元素处理,可以通过绑定插件的方式来配置要执行的任务。每个插件中可以定义阶段,每个插件可以有多个目标,可以绑定任务到某个插件的某个阶段中的目标上去

八.mvn 好用的命令


  • ​mvn package​​:打包会在 target 文件夹下生成 example-1.0-SNAPSHOT.jar
  • ​mvn clean​​:清理 target 目录
  • ​mvn package​​:打包成 jar 包或者 war 包
  • ​mvn test​​:执行测试用例
  • ​mvn install​​:模块安装命令
  • ​mvn deploy​​:将打包的文件发布到远程
  • ​mvn archetype:generate​​:maven 工程依据原型创建
  • ​mvn project-info-reports:dependencies​​:生成项目依赖的报表
  • ​mvn dependency:resolve​​:查看依赖
  • ​mvn dependency:tree​​:查看依赖树
  • ​mvn dependency:list​​:依赖列表
  • ​mvn dependency:sources​​:下载依赖包源码
  • ​mvn install -X​​:追踪依赖的完整轨迹
  • ​mvn resource compile process-classes process-test-resources test-compile test prepare-package package​​maven 生命周期
  • ​mvn validate​​:验证项目是否正确
  • ​mvn jar:jar​​:只打 jar 包
  • ​mvn source:jar​​:生成源码 jar 包
  • ​mvn generate-sources​​:产生应用需要的任何额外 源代码
  • ​mvn compile​​:编译源代码
  • ​mvn test-compile​​:编译测试代码
  • ​mvn verify​​:运行检查
  • ​mvn idea:idea​​:生成 idea 项目
  • ​mvn tomcat:run​​:启动 tomcat
  • ​mvn jetty:run​​:启动 jetty
  • ​mvn tomcat:deploy​​:运行打包部署
  • ​mvn tomcat:undeploy​​:撤销部署
  • ​mvn tomcat:start​​:启动 web 应用
  • ​mvn tomcat:stop​​:停止 web 应用
  • ​mvn tomcat:redeploy​​:重新部署
  • ​mvn war:exploded tomcat:exploded​​:部署展开的 war

九.Maven 开发者技巧


  • 自己写好的程序想做成依赖,在不放到中央仓库和项目文件中的前提下希望所有人都能用到:假如中央仓库中不存在某个依赖,自己需要,于是自己手动写完程序封装成 jar 包,但是又不想放在项目中防止项目打包的时候增加了 jar 包的容量,可是不放在项目里头,放在项目外头,当打成 jar 包,别人使用就会找不到该依赖,该怎么做呢?有两种方式,第一种是将 jar 包放在自己的服务器上头,第二种方式将 jar 包放在我网络上
  • 远程仓库:
    大致操作是现在 pom.xml 或者 settings.xml 中配置好远端仓库信息,然后通过 deploy 命令将项目的 jar 放到远端仓库,使用的话也是配置好 pom.xml 或者 settings.xml 就可以引用依赖,可参见博客 1 和​​博客 2 ​​和博客 3
  • 开发 maven 的 web 应用:通过 maven 的原型插件 maven-archetype-webapp 生成 web 应用结构,使用命令
​​mvn archetype:generate
-DgroupId=com.companyname.automobile
-DartifactId=trucks
-DarchetypeArtifactId=maven-archetype-webapp
-DinteractiveMode=false
  • ​maven 会处理并且创建完整的基于 web 的 java 应用程序工程结构
    存在结构 src/main/webapp/WEB-INF 和 src/main/webapp/index.jsp
    package 命令可以 webapp打包成 war 包,要是部署的话,可以把 target 下产生的这个 war 包 copy 到你的服务器的 webapp 目录下,并重启 web 服务
  • idea 中查看 maven 依赖树:

  • 通过右边 Maven Project 来查看,邮件之后点击 Show Dependencies… 来查看图形形式的依赖
  • 通过 mvn 命令来查看
    ​mvn dependency:tree ​