发布时间:2022-09-26 22:00
Maven之坐标和依赖_jerry_dyy的博客-CSDN博客
Maven之仓库_jerry_dyy的博客-CSDN博客
Maven之聚合与继承_jerry_dyy的博客-CSDN博客
Maven之生命周期和插件_jerry_dyy的博客-CSDN博客
生命周期是抽象的,不做任何实际的工作,实际的任务交由插件来完成。
Maven拥有三套相互独立的生命周期,它们分别为:clean,default,site。每个生命周期都包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。
clean: 清理项目, 包含pre-clean,clean,post-clean三个阶段。
default: 构件项目,包含process-sources,compile,process-test-sources,test-compile,test,package,install,deploy等阶段。
site: 建立项目站点,包含pre-site, site, post-site, site-deploy四个阶段。
可以通过命令行来调用Maven的生命周期:
mvn clean,调用的是clean生命周期的pre-clean,clean阶段;
mvn package,调用的是default生命周期的validate、initialize等,直到package的所有阶段。
如果想要实现清理旧的构建内容并重新打包,可以使用:mvn clean package
以maven-dependency-plugin举例,它包含的几个插件目标为:dependency:analyze,dependency:tree,dependency:list等。冒号前面是插件前缀,冒号后面是该插件的目标。
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言就是,生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。例如:maven-compiler-plugin这一插件的compile目标能够绑定到default生命周期的complie这一阶段,完成编译任务。
Maven的默认绑定:
为了能让用户几乎不用任何配置就能构建Maven项目,Maven在核心为一些主要的生命周期阶段绑定了很多插件目标,当用户通过命令调用生命周期阶段的时候,对应的插件目标就会执行响应的任务。
生命周期阶段 | 插件前缀:插件目标 | 执行任务 |
clean | maven-clean-plugin:clean | 清理旧的构建输出 |
process_resources | maven-resources-plugin:resources | 复制主资源文件到主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码到主输出目录 |
process-test-resources | maven-resources-plugin:testResources | 复制测试文件到测试输出目录 |
test-compile | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 创建项目jar包 |
install | maven-install-plugin:install | 将项目构件安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目构件部署到远程仓库 |
site | maven-site-plugin:site |
自定义绑定:
用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,一个常见的例子就是创建项目的源代码jar包(xxx-sources.jar),maven-source-plugin可以帮助我们完成该任务,它的jar-no-fork目标能够将该项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上:
org.apache.maven.plugins
maven-source-plugin
2.1.1
attach-sources>
verify
jar-no-fork
如果多个插件的目标绑定到了同一个阶段,它们的执行顺序由这些插件声明的先后顺序决定了它们内部目标的执行顺序。
命令行配置插件:
用户可以通过命令行配置插件目标的参数,用户可以在Maven命令中使用-D参数,并伴随着一个参数键=参数值的形式,来配置插件目标的参数。
例如:maven-surfire-plugin提供了一个maven.test.skip参数,当其值为true的时候,就会跳过测试,于是,在运行命令的时候:mvn install -Dmaven.test.skip=true
参数-D是java自带的,其功能是通过命令行设置一个Java系统属性。
POM中插件全局配置:
并不是所有的插件参数都适合从命令行配置,有些参数的值从项目创建到项目发布都不会发生改变,对于这种情况,在POM文件中一次性配置就显然比重复在命令行输入方便。
用户可以在声明插件的适合,对此插件进行一个全局的配置。例如:配置maven-compiler-plugin,告诉它编译Java1.8版本的源文件,生成与JVM1.8兼容的字节码文件:
org.apache.maven.plugins
maven-compiler-plugins
2.1
1.8
网站:
Apache: Maven – Available Plugins
Codehaus: http://mojo.codehaus.org/plugins.html
命令行:
Mvn help: describe -Dplugin =org.apache.maven.plugins:maven-compiler-plugin:2.1
这里执行的是maven-help-plugin的describe目标,在plugin中输入需要描述插件的groupId、artifactId、version,Maven在命令行输出maven-compiler-plugin的简要信息。
对于已经绑定到生命周期上的插件,在命令行输入生命周期即可调用得到。
对于不适合绑定到生命周期上的插件来说,可以通过命令行直接调用,例如:
Mvn help:describe
Mvn dependency:tree
其中help、dependency分别是maven-help-plugin和maven-dependency-plugin的插件前缀,所谓插件前缀其实就是插件的简写而已。
Maven会区别对待依赖的远程仓库与插件的远程仓库,repositories与pluginRepositories,插件解析机制与依赖解析机制差不多。