目录
maven生命周期
- mvn命令demo
mvn clean package:打包
mvn clean install: 安装到本地
mvn clean deploy:部署到远程私服
maven生命周期以及执行原理
- maven生命周期,就是mvn各种命令背后的原理,就是对传统软件项目构建工作的抽象 (清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成)
- maven有三套完全独立的生命周期
clean, default, site
每套生命周期都可以独立运行,每个生命周期的运行都会包含多个phase,每个phase又是由各种插件的goal来完成的,一个插件的goal可以认为是一个功能。
这就是maven的生命周期 -> phase(可以理解为阶段) -> 插件的关系,也是maven构建执行的核心原理
你每次执行一个生命周期,都会依次执行这个生命周期内部的多个phase,每个phase执行时都会执行某个插件的goal完成具体的功能
maven的生命周期以及phase
- clean生命周期包含的phase
- pre-clean
- clean
- post-clean
- default生命周期包含的phase
- validate:校验这个项目的一些配置信息是否正确
- initialize:初始化构建状态,比如设置一些属性,或者创建一些目录
- generate-sources:自动生成一些源代码,然后包含在项目代码中一起编译
- process-sources:处理源代码,比如做一些占位符的替换
- generate-resources:生成资源文件,才是干的时我说的那些事情,主要是去处理各种xml、properties那种配置文件,去做一些配置文件里面占位符的替换
- 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:使用单元测试框架运行测试
- prepare-package:在打包之前进行准备工作,比如处理package的版本号
- package:将代码进行打包,比如jar包
- pre-integration-test:在集成测试之前进行准备工作,比如建立好需要的环境
- integration-test:将package部署到一个环境中以运行集成测试
- post-integration-test:在集成测试之后执行一些操作,比如清理测试环境
- verify:对package进行一些检查来确保质量过关
- install:将package安装到本地仓库中,这样开发人员自己在本地就可以使用了
- deploy:将package上传到远程仓库中,这样公司内其他开发人员也可以使用了
- site生命周期的phase
- pre-site
- site
- post-site
- site-deplo
默认的phase和plugin绑定
- 实际上,默认maven就绑定了一些plugin goal到phase上去,比如:类似于resources:resources这种格式,说的就是resources这个plugin的resources goal(resources功能,负责处理资源文件)
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar或者war:war
install install:install
deploy deploy:deploy
- site生命周期的默认绑定是:
site site:site
site-deploy site:deploy
- clean生命周期的默认
clean clean:clean
maven的命令行和生命周期
- 比如mvn clean package
clean是指的clean生命周期中的clean phase
package是指的default生命周期中的package phase
此时就会执行clean生命周期中,在clean phase之前的所有phase和clean phase,pre clean,clean
同时会执行default生命周期中,在package phase之前的所有phase和package phase
- mvn clean package
但是,pre clean phase默认是没有绑定任何一个plugin goal的,所以默认什么也不会干;
clean phase默认是绑定了clean:clean,clean plugin的clean goal,所以就会去执行clean插件的clean goal,就会实现一个功能,就是清理target目录下的文件
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar或者war:war
install install:install
deploy deploy:deploy
- mvn dependency:tree mvn deploy:deploy-file
就是不执行任何一个生命周期的任何一个phase
直接执行指定的插件的一个goal
比如mvn dependency:tree,就是直接执行dependency这个插件的tree这个goal,这个意思就是会自动分析pom.xml里面的依赖声明,递归解析所有的依赖,然后打印出一颗依赖树
mvn deploy:depoy-file,就是直接执行deploy这个插件的deploy-file这个goal,这个意思就是说将指定目录的jar包,以指定的坐标,部署到指标的maven私服仓库里去,同时使用指定仓库id对应的server的账号和密码。
maven插件
插件和goal
- 每个插件都有多个goal,每个goal都是一个具体的功能
dependency插件有十几个goal,可以进行分析项目依赖,列出依赖树,等等
插件的goal,写法就是plugin:goal,比如dependency:tree
用mvn dependency:tree,就可以手动执行某个插件的goal,执行某种功能
将插件的goal绑定到phase上
- maven内置就会绑定一些插件的goal到phase上,我们如果要使用某个maven插件,如何手动将插件的goal绑定到phase上
- 比如将source插件的jar-no-fork goal绑定到verify phase,在完成集成测试之后,就生成源码的jar包,这里可以看到绑定plugin的语法:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
运行mvn verify,就可以看到生成了一个包含源码的jar包
即使不配置绑定的phase也可以,因为大多数插件都默认内置了要绑定的phase,比如这个插件就内置绑定在package phase。
配置插件
如果在命令行执行插件,可以用-Dkey=value来进行插件的设置
比如mvn install -Dmaven.test.skip=true,就是surefire插件在测试的时候提供的参数,设置为true就会跳过测试
此外也可以在pom.xml中用来配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
找到你需要的插件
在http://maven.apache.org/plugins/index.html中可以找到所有的插件,里面有文档
你可以百度搜索,用maven启动jetty插件,用maven部署tomcat插件
插件解析
先从本地仓库找插件,没有则从远程仓库找插件
插件的远程仓库也需要配置,maven默认配置了远程的插件仓库
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>