Maven学习笔记

学习资料:Maven官方文档

最常用的两种打包方法

  • clean,package(如果报错,很可能就是jar依赖的问题)
  • clean,install

Maven生命周期

Maven有三种内置的构建生命周期:default,clean,site。default生命周期处理项目部署,clean生命周期处理项目清理,site生命周期处理项目web站点的建立。每个生命周期包含一系列阶段

default生命周期阶段(非完整)

validate:验证,验证工程是否正确,所需的信息是否完整。

compile:编译源码,编译生成class文件,编译命令,只编译选定的目标,不管之前是否已经编译过,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及resources下的文件。

test:单元测试

package:打包,将工程文件打包为指定的格式,例如JAR,WAR等。这个命令会在你的项目路径下一个target目录,并且拥有compile命令的功能进行编译,同时会在target目录下生成项目的jar/war文件。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目,这时就用到install命令了

integration-test:将jar包部署到环境中进行单元测试

verify:核实,检查package是否有效、符合质量标准。

install:将包安装至本地仓库,以作为其它项目的dependency。该命令包含了package命令功能,不但会在项目路径下生成class文件和jar包,同时会在你的本地maven仓库生成jar文件,供其他项目使用(如果没有设置过maven本地仓库,一般在用户/.m2目录下。如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件,解决了上面打包package出错的问题)。

deploy:复制到远程仓库。

clean生命周期阶段(非完整)

clean:清理,在进行真正的构建之前进行一些清理工作,移除所有上一次构建生成的文件。执行该命令会删除项目路径下的target文件,但是不会删除本地的maven仓库已经安装的jar文件。

site生命周期阶段(非完整)

site:站点,生成项目的站点文档

图 15

Phases are actually mapped to underlying goals. The specific goals executed per phase is dependant upon the packaging type of the project. For example, package executes jar:jar if the project type is a JAR, and war:war if the project type is - you guessed it - a WAR.
An interesting thing to note is that phases and goals may be executed in sequence.

mvn clean dependency:copy-dependencies package

这条命令执行了mvn的clean阶段,dependency插件的copy-dependencies目标,package阶段(package处于default生命周期,Maven会先顺序执行validate、compile、test)

阶段由插件目标构成

一个插件目标代表一个具体的任务(比阶段更细),它可以被绑定到0个或多个阶段。没有绑定到阶段也能直接执行,目标和阶段执行顺序取决于调用的顺序

For example, consider the command below. The clean and package arguments are build phases, while the dependency:copy-dependencies is a goal (of a plugin).

mvn clean dependency:copy-dependencies package

如果一个目标被绑定到一个或多个阶段,目标将在阶段中被调用。如果阶段没有绑定任何目标,那阶段就不会执行。如果阶段绑定一个或多个目标,执行这个阶段会执行所有目标,目标执行的顺序在POM中定义

build和compile的区别

点击Build Project,idea 使用自己的构建工具进行编译(编译器默认使用Javac),相当于maven的compile,点击Build Artifacts,相当于maven的Package
图 15

插件和goal

a plugin is a collection of goals with a general common purpose. For example the jboss-maven-plugin, whose purpose is “deal with various jboss items”.

总结

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个阶段。

注意:maven默认的生命周期中,不管是package还是install,都不会把第三方依赖打包到一个jar包中,需要自己配置插件,比如maven-assembly-plugin。若是springboot项目,有spring-boot-maven-plugin插件,执行mvn package后,先走一遍maven自身生命周期到package,然后springboot打包插件里面提供了一个repackage的goal,这样mvn package在插件的指导下先完成标准的打包流程再完成插件定义的流程

图 16