本文隶属于新手图文教程《IDEA+Maven搭建Spring+SpringMVC+Mybatis项目骨架》
一、生命周期图解
1. LifeCycle and Phase(生命周期与阶段)
先用一张图解释一下Maven的生命周期及其阶段。
注:图中Default周期的阶段清单是精简版。其完整版可参照官方文档:参考链接
如上图所示,Maven定义了三个LifeCycle(生命周期),分别有以下意义:
- Clean - 负责项目构建生成文件的清理
- Default - 负责部署项目
- Site - 负责构建项目文档
Maven又给每个LifeCycle(生命周期)定义了一个Phase List(阶段清单),把生命周期分成了若干个阶段,并约定生命周期的阶段必须按次序执行。正常情况下,一个周期应该从阶段清单的第一项按次序执行到最后一项;但如果用户指定了阶段,则只从该周期的第一项依次执行到指定项。例如:
mvn clean install
将依次执行以下阶段(强行插张图):
2. Phase(阶段)的实现
如上所述,maven是一套标准,定义了构建项目的通用方式。它本身并不对这些构建阶段进行实现。我们所看到的maven的功能,是通过Parent Poms预定义的插件实现的。
Plugin的Goal(目标)就是maven插件指定的、为达到某一目标而执行的一系列事务。以install插件为例:
- maven-install-plugin:install - 把当前模块安装到本地maven仓库
- maven-install-plugin:install-file - 把外部的模块安装到本地maven仓库
- maven-install-plugin:help - 在命令行界面下打印该插件的帮助信息
借助图片,理解以下信息:
- maven-install-plugin:install这个目标绑定了生命周期Default的install阶段,执行到install阶段其实就是在执行maven-install-plugin:install。
- Integration-Test阶段没有绑定任何Goal,也就是说,默认情况下,在这个阶段,maven什么都不做。这是maven预留的接口,你可以绑定自己的实现。
- mvn install并不完全等价于maven-install-plugin:install。以mvn clean install那张流程图为例,执行mvn install其实调用了很多个阶段,即调用了很多个插件的目标,先后进行了校验、编译测试、打包、安装到本地仓库等过程。相比之下,执行maven-install-plugin:install仅仅是执行了把包安装到本地仓库这一个过程。
以下是maven在打包war/jar时,依次执行的Phase及其绑定的插件Goals
Phase(阶段) | Goal(目标) | 意义 |
---|---|---|
process-resources | maven-resources-plugin:resources | 对资源文件进行变量替换和复制到输出目录的操作 |
compile | maven-compiler-plugin:compile | 编译项目源代码 |
process-test-resources | maven-resources-plugin:testResources | 对test资源文件进行变量替换和复制到输出目录的操作 |
test-compile | maven-compiler-plugin:testCompile | 编译项目测试代码 |
test | maven-surefire:surefire:test | 执行测试代码 |
package | maven-jar-plugin:jar | 打包 |
install | maven-install-plugin:install | 把包安装到maven本地仓库 |
deploy | maven-deploy-plugin:deploy | 部署到服务器 |
在使用默认配置的情况下,无需在study-parent/pom.xml的project.build.plugins节点重复定义以上插件。但如果需要进行个性化的配置,则需要定义插件并配置参数,以覆盖默认配置。
二、命令行方式
#打包语法:mvn package -PprofileID -DskipTests
#@ package --周期只进行到package阶段
#@ -P --指定要激活的profile(可选,不指定时激活默认active的profile)
#@ profileID --在pom的project.build.profiles.profile.id节点定义的ID
#@ -D --指定系统变量(可选)
#@ skipTests --跳过测试(完整版为maven.test.skip=true,既跳过测试,也跳过测试代码的编译.也可以在pom里定义surefire插件并配置该参数)
#打包示范(生产环境)
mvn clean package -Pprod -DskipTests
#----------------------------------------------------------------------#
#测试语法:mvn test -Dtest=MyFirstTest
#@ test --周期只进行到test阶段
#@ -D --指定系统变量(可选),不指定时,对所有类名符合规则的测试类进行test
#@ MyFirstTest --指定测试类类名
#测试示范(全部测试)
mvn test
#----------------------------------------------------------------------#
#运行(不推荐使用,不方便关闭)
mvn clean install tomcat7:run -Pdev
#部署
mvn clean install tomcat7:deploy -Pprod
三、Maven可视化插件方式
如图所示,IDEA界面右边缘有个Maven Project的标签,单击即可唤出Maven插件。
- 在Profiles节点下,可以勾选需要激活的Profile
- 在study-parent.lifecycle节点下,双击可以相应执行mvn phase命令
- 在study-parent.plugins节点下,双击可以相应执行mvn plugin:goal命令
四、IDEA代理方式
1. 本地调试
下面演示一种比较简单的方法来新建tomcat:run的配置:
- 选择需要激活的Profiles
- 在tomcat7:run上面点鼠标右键
- 选择“Create 'study-parent [tomcat...'...”
至此,IDEA自动创建了一个名为 study-parent[tomcat7:run] 的配置,相当于在命令行执行tomcat7:run,激活的profiles为dev(多个profiles用空格分开,在profilename前面加短横线表示禁用该profile)。
Before Launch(在运行该配置之前),我们需要maven帮忙build项目。按红箭头所示,点左下角“+”。
在弹出的菜单中,选择“Run Maven Goal”。
注意,这里所谓的Command line并不是真的让你填入mvn命令,而是让你填入该命令的参数,系统自动会执行mvn。
clean install -Pdev -Dmaven.test.skip=true
#注意,这里不需要敲入mvn,IDEA会负责调用该命令
#1、先清空上次构建的内容
#2、校验、编译、打包、安装一条龙
#参数:用名为dev的profile进行build
#参数:不用进行测试
以上是我填写的命令。
接着一路确定,完成配置。
配置完成后,界面右上角出现了刚才的配置。点红线方框右边的虫子图标,即可Debug该配置。
2. 使用Junit进行测试
下面演示使用Junit进行测试的配置(当然也可以用maven自带的surefire)
同样在界面右上角(windows版本的位置可能有点差别),在之前配置好的study-parent[tomcat7:run]右边,点击下拉箭头,然后选择"Edit Configurations..."
已经能看到已经配置好的tomcat7配置了,这里我们新建一个,点“+”
选择Junit,下一行那个JUnit Test Discovery是覆盖率测试。
按图示操作,即可完成配置。更多配置说明:参考链接 (等我熟悉之后再写篇文章具体说明一下)