学习资料: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:站点,生成项目的站点文档
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
插件和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在插件的指导下先完成标准的打包流程再完成插件定义的流程