Maven的build生命周期和常用plugin

简介

Maven和gradle应该是现代java程序员中使用的最多的两种构建工具。在它们出现之前,则是ant的天下。

Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可。

今天我们要讨论一下mvn命令之下的生命周期的构建。

更多精彩内容且看:

更多内容请访问www.flydean.com

lifecycle和Phases

所谓lifecycle,可以理解为可以执行一组命令的集合,用来执行具体的某些操作。

Maven默认有三种lifecycle:default,clean和site。default主要用来处理项目的开发,clean主要用来负责项目的清理,site主要用来生成项目的文档。

lifecycle是由一个或者多个phase组成的。

以default为例,它大概由23个phases组成,这些phases将会按顺序执行来完成default的lifecycle。

我们选取default lifecycle中非常常见的几个phase来说明一下:

  • validate - 用来验证项目是否正确或者项目所需要的信息是否可用。
  • compile - 用来编译项目代码
  • test - 执行代码中的单元测试
  • package - 将编译后的代码进行打包,打包可有很多种方式,比如:jar,war等
  • verify - 执行集成测试
  • install - 将项目安装到本地仓库中,供有依赖关系的其他项目使用
  • deploy - 将项目部署到远程仓库,以便共享给其他的用户

上面的phase执行是有顺序的,比如我们如果执行mvn verify,则会顺序执行validate,compile,test和package。

Phases和Goals

Phases是一种任务的集合,它是由一个或者多个Goals组成的。Goals可以包含在Phases里面执行,也可以单独用命令执行。

那么Goals又是从哪里来的呢?Goals是定义在maven中的plugin中的。

我们看下面一张直观的图:

下图列出了现有lifecycle中的phase,和相应phase所对应的plugin。

我们可以看到基本每个phase都和一个plugin中的golas是相对于应的。

除了使用命名直接指定要执行的phase以外,还可以直接指定goals:

mvn clean dependency:copy-dependencies package

上面的命令中clean和package是phase,而copy-dependencies则是goals。

常用plugin介绍

这里我们介绍两个非常常用的maven plugin,maven-dependency-plugin和maven-jar-plugin。

maven-dependency-plugin

maven中的依赖jar包是存放在maven的本地仓库中的,如果项目中依赖了某些jar包,在部署的时候还需要这些依赖的jar包拷贝出来,非常不方便,有了maven-dependency-plugin,则可以借用它的copy-dependencies来将项目的依赖jar包拷贝出啦,如下所示:

1 <plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-dependency-plugin</artifactId> 4 <version>3.1.2</version> 5 <executions> 6 <execution> 7 <id>copy</id> 8 <phase>package</phase> 9 <goals> 10 <goal>copy-dependencies</goal> 11 </goals> 12 <configuration> 13 <outputDirectory> 14 ${project.build.directory}/lib 15 </outputDirectory> 16 </configuration> 17 </execution> 18 </executions> 19 </plugin>

goals是和相应的phase相关联的,在上面的例子中,我们将copy-dependencies和package相关联,则在我们执行mvn package的时候就会自动执行copy-dependencies,从配置文件可以知道,我们将会把项目的依赖jar包拷贝到项目的build目录的lib目录下。

maven-jar-plugin

有了依赖的lib,可以将main程序打包成为一个可执行的jar包。这时候我们就需要使用到maven-jar-plugin。

1<plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-jar-plugin</artifactId> 4 <version>3.2.0</version> 5 <configuration> 6 <archive> 7 <manifest> 8 <mainClass>com.flydean.MavenClass</mainClass> 9 </manifest> 10 </archive> 11 </configuration> 12 </plugin>

为了生成可执行的jar包,我们需要在MANIFEST.MF文件中添加mainClass文件的路径,这样在执行jar包的时候,无需额外的参数即可运行。

遗憾的是,如果我们的class文件用到了外部jar包的依赖时候,jar包直接运行会出错,因为找不到所依赖的jar包。

在介绍maven-dependency-plugin的时候,我们已经把所用到的lib拷贝出来了,这里我们可以直接使用:

1<plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-jar-plugin</artifactId> 4 <version>3.2.0</version> 5 <configuration> 6 <archive> 7 <manifest> 8 <addClasspath>true</addClasspath> 9 <classpathPrefix>lib/</classpathPrefix> 10 <mainClass>com.flydean.MavenClass</mainClass> 11 </manifest> 12 </archive> 13 </configuration> 14 </plugin>

多加了两个addClasspath的参数,我们将打包好的jar包解压缩。

可以看到里面多了一个MANIFEST.MF的文件:

1Manifest-Version: 1.0 2Created-By: Maven Jar Plugin 3.2.0 3Build-Jdk-Spec: 14 4Class-Path: lib/lombok-1.18.10.jar lib/logback-classic-1.2.3.jar lib/log 5 back-core-1.2.3.jar lib/slf4j-api-1.7.25.jar 6Main-Class: com.flydean.MavenClass

这个文件里面包含了一些jar包的元数据,并且里面添加了Class-Path和Main-Class文件,这时候执行运行jar包就可以直接执行了。

总结

本文介绍了maven构建时候的生命周期,并介绍了两个经常会使用到的plugin。

本文的例子https://github.com/ddean2009/ learn-java-base-9-to-20

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/apache-maven-lifecycle/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

点赞
收藏

评论区

加载中...

相关推荐

Maven 构建生命周期

Maven构建生命周期定义了一个项目构建跟发布的过程。一个典型的Maven构建(build)生命周期是由以下几个阶段的序列组成的:阶段处理描述验证validate验证项目验证项目是否正确且所有必须信息是可用的编译compile执行编译源代码编译在此阶段完成测试Test测试使用适当的单元测试框架(例如JUn

Apache Maven ToolChains的使用

简介Maven是java中非常有用和常用的构建工具,基本上现在大型的java项目都是Maven和gradle的天下了。因为JDK的版本现在以每半年一次的速度在飞速发展。不同的JDK版本就有不同的java路径,我们在使用Maven的过程中,可能经常会需要切换JDK的版本。一般来说我们可以在mavencompilerplugin中配置好ex

Gradle的构建过程都不会?带你全面了解Android如何自定义Gradle插件

目前Android工程的默认构建工具为Gradle,我们在构建APK的时候往往会执行./gradlewassembleDebug这样的命令。。那么这个命令到底代表着什么含义呢?命令的执行究竟是在做什么事情呢?我们能不能在命令执行的过程中做一些自己的操作呢?接下来我们来具体的进行分析。Gradle的构建过程G

CentOS 7 安装 Gradle

       Java生态体系中有三大构建工具:Ant、Maven和Gradle。其中,Ant是由Apache软件基金会维护;Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在JakataTurbine项目中用来简化构建过程;Gradle是一个基于ApacheAnt和ApacheMaven概念的项目自动化构建开源工具,它使用一种基于G

Spring 3 mvc hello world例子

本篇文章中,我会使用maven构建一个基于SpringMVC的入门例子,前端标签库使用的是jstl。在开始之前,请确保你已经安装maven、eclipse以及tomcat。1.创建maven工程在eclipse的工作区中使用maven命令行创建一个空白工程,当然你也可以用eclipse的m2eclipse插件来创建。mvnarch

Gradle之介绍

Gradle是基于JVM构建工具的新一代版本。它从现有的构建工具如Ant和Maven中学到了很多东西,并且把它们的最优思想提升到更高层次。遵循基于约定的构建方式,Gradle可以用一种声明式的方式为你的问题领域建模,它使用一种强大的且具有表达性的基于Groovy的领域特定语言(DSL),而不是XML,因为Gradle是基于JVM的,它允许你使用自己最喜欢的J