Maven的build生命周期和经常使用plugin

简介

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

Maven为咱们封装了不少构建中很是有用的操做,咱们只须要执行简单的几个mvn命令便可。git

今天咱们要讨论一下mvn命令之下的生命周期的构建。程序员

更多精彩内容且看:github

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

lifecycle和Phases

所谓lifecycle,能够理解为能够执行一组命令的集合,用来执行具体的某些操做。apache

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

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

以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包拷贝出啦,以下所示:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.2</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                            ${project.build.directory}/lib
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

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

maven-jar-plugin

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

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.flydean.MavenClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

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

遗憾的是,若是咱们的class文件用到了外部jar包的依赖时候,jar包直接运行会出错,由于找不到所依赖的jar包。

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

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.flydean.MavenClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

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

能够看到里面多了一个MANIFEST.MF的文件:

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

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

总结

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

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

本文做者:flydean程序那些事

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

本文来源:flydean的博客

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

相关文章
相关标签/搜索